Exe在c++中退出该方法后崩溃
Exe crashes after coming out of the method in c++
我有一个方法FormatOutPut()
,在c++中内部调用"callBack"方法MyFunct()
。有一个崩溃,当控制出来的FormatOutPut()
。回调方法MyFunct()
只是在屏幕上打印输出。当我使用windbg调试代码时,我得到了以下跟踪,
(1250.1270): Stack buffer overflow - code c0000409 (!!! second chance !!!)
我猜的是,FormatOutPut()
的堆栈上的返回地址被回调方法破坏了。因此,当控制权被转移回调用方法时,它会崩溃。
当我注释掉回调方法时,一切都很好。这方面的任何意见都将大有帮助。
回调方法原型如下,
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
我看到的问题是,你对函数原型的typedef
的__stdcall
调用约定和回调函数本身不匹配。如果调用约定不匹配,则从被调用函数返回时可能出现堆栈问题。
更多的调用约定在这里。
该函数的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)
请注意,当分配一个函数的定义与这个小示例演示的原型不匹配时,编译器应该捡起这个问题(如果这个编译器错误发生,不要试图通过应用C
风格的强制转换来关闭编译器来修复它——这不是一个修复)。
相关文章:
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 类指针方法崩溃程序
- 使用push_back方法获取智能指针矢量时应用崩溃
- 在崩溃时释放分配的指针的正确方法
- 具有协变返回类型的方法在 VC++ 上崩溃
- C++ 程序在应用主题方法上崩溃
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 为什么我的C++程序有时会在离开方法时崩溃
- 我的 Word Addin 在调用 IDTExtensibility2 的 OnDisconnection 方法后崩溃
- 使用成员编写移动构造函数的正确方法unique_ptr(崩溃)
- QTimer 在以单独的方法启动时崩溃
- Push_back指针向量的方法会导致崩溃C++
- OpenGL - 重新排序渲染方法后崩溃
- 获取方法上的代码崩溃,C++
- Android JNI :调用对象方法时应用程序崩溃
- C# 应用程序在对 COM 类的方法调用时崩溃
- 调用不访问 null 对象指针上数据的方法有时有效,有时崩溃。为什么它不总是崩溃?
- 带有自定义对象的矢量:当我想使用用.at方法接收的矢量时崩溃
- 同名类之间的共享 vtables:强制转换为基类型时,对虚拟方法的调用崩溃
- 类的实例只允许1个方法或程序崩溃