gpt4 book ai didi

c++ - exe从c++中的方法出来后崩溃

转载 作者:行者123 更新时间:2023-11-30 20:22:50 25 4
gpt4 key购买 nike

我有一个方法 FormatOutPut(),它在 C++ 中内部调用“callBack”方法 MyFunct()。当控件出现 FormatOutPut() 时,会发生崩溃。回调方法 MyFunct() 只是将输出打印在屏幕上。当我使用windbg调试代码时,我得到了以下跟踪,

(1250.1270): Stack buffer overflow - code c0000409 (!!! second chance !!!)

我猜测,FormatOutPut() 堆栈上的返回地址已被回调方法损坏。因此,当控制权转移回调用方法时,它会崩溃。

当我注释掉回调方法时,一切正常。对此的任何意见都会有很大帮助。

回调方法原型(prototype)如下,

typedef void(__stdcall *MyCallBack)(char*,char*,char*,char*,char*,char*,char*,char*,char*,char*,int, int );

正文:-

void MyCallbackRoutine(char* GetFeature,char* GetVersion,char* GetStartDate, char* GetExpireDate, char* GetUsers,char* GetKey,char* GetVendorString, char* GetHostID,char* GetErrorMsg,char* GetLicense,int GetCheckOutStatus, int nCount)     
{
if ( nCount == 0 )
{

_strtime_s( timeCallbackstart, 10 );

time(&startCallbackstart);

bOnlyOnce = true;
}
cout << endl;
cout << "-------------------------------------------------------" << endl;
cout << "GetCheckOutStatus: " << GetCheckOutStatus << endl;
cout << "GetErrorMsg: " << GetErrorMsg << endl;
cout << endl;
cout << "GetFeature: " << GetFeature << endl;
cout << "GetVersion: " << GetVersion << endl;
cout << "GetStartDate: " << GetStartDate << endl;
cout << "GetExpireDate: " << GetExpireDate << endl;
cout << "GetUsers: " << GetUsers << endl;
cout << "GetKey: " << GetKey << endl;
cout << "GetVendorString: " << GetVendorString << endl;
cout << "GetHostID: " << GetHostID << endl;
cout << "GetLicense: " << GetLicense << endl;
cout << endl;
cout << "Licenscounter: " << nCount << endl;
cout << "------------------------------------------------------" << endl;
cout << endl;

}

感谢和问候,AKJ

最佳答案

我看到的问题是函数原型(prototype)的 typedef__stdcall 调用约定与回调函数本身不匹配。如果调用约定不匹配,从被调用函数返回时可能会出现堆栈问题。

更多关于calling conventions here .

该函数的typedef如下:

typedef void(__stdcall *MyCallBack)(char*,char*,char*,char*,char*,char*,char*,
char*,char*,char*,int, int );

但是分配为回调的函数具有以下内容:

void MyCallbackRoutine(char* GetFeature,char* GetVersion,char* GetStartDate, 
char* GetExpireDate, char* GetUsers,char* GetKey,
char* GetVendorString, char* GetHostID,
char* GetErrorMsg,char* GetLicense,
int GetCheckOutStatus, int nCount)

参数的数量和类型匹配,返回类型void匹配,但不匹配的关键元素是缺少__stdcall。如果不指定,默认调用约定为__cdecl。更正应该是:

void __stdcall MyCallbackRoutine(char* GetFeature,char* GetVersion,char* GetStartDate, 
char* GetExpireDate, char* GetUsers,char* GetKey,
char* GetVendorString, char* GetHostID,
char* GetErrorMsg,char* GetLicense,
int GetCheckOutStatus, int nCount)

请注意,当分配一个定义与原型(prototype)不匹配的函数时,编译器应该已经发现了这个问题 this small example演示(如果发生此编译器错误,请不要尝试通过应用 C 样式强制转换来关闭编译器来修复它 - 这不是修复)。

关于c++ - exe从c++中的方法出来后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com