Exe在c++中退出该方法后崩溃

Exe crashes after coming out of the method in c++

本文关键字:方法 崩溃 退出 c++ Exe      更新时间:2023-10-16

我有一个方法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风格的强制转换来关闭编译器来修复它——这不是一个修复)。