Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.

bytxl發表於2015-06-22

首先,確定自己的程式碼正確,執行緒函式正確退出後,報這個錯,最後發現執行緒函式是這麼定義:

static DWORD WINAPI ServerWork(LPVOID lpParameter)

其中WINAPI為:

#define WINAPI      __stdcall

把WINAPI去掉就好了。

解析:

主模組在呼叫Dll的匯出函式時會儲存返回地址在堆疊中(ESP+xxx)。函式呼叫返回時,會彈棧取得返回地址(ESP-xxx),從而返回到主模組。 

vaule of ESP was not properly saved across a function call. 

上面出現的錯誤是系統提示主模組呼叫前堆疊的指標(ESP),與呼叫匯出函式後的指標不符。 

一般有兩種情況會出現類似錯誤。 
1. Dll匯出函式宣告匯出方法,與主模組中宣告的匯入方法不一致。使得呼叫時引數的傳遞中,破壞了呼叫堆疊,出現錯誤。 

2. Dll匯出函式本身破壞了呼叫堆疊。編碼中最一般的錯誤比如:物件(如CString)等。 

解決方法: 
針對第1種情況,請確定匯出方(Dll等)與匯入方(Exe等)的宣告保持一致。 
對於第2種情況,請保證產生的物件都被安全的釋放。 

備註: 
可以試試下面的方法可以簡單的測試方法 
將Dll的匯出函式定義成空處理(直接返回),如還出現錯誤,則是呼叫錯誤。

國外論壇不少人也提過這個問題將Calling Convention由原來的__cdecl (/Gd)修改為__stdcall (/Gz),其實是因為IUnknown被轉換為IDispatch的問題。

http://blog.csdn.net/sysprogram/article/details/7737397

http://www.cnblogs.com/junchu25/archive/2012/08/10/2631133.html


相關文章