2011-10-05 70 views
0

當我嘗試運行以下函數時,出現以下錯誤。否則,在完成函數過程時,我收到錯誤。調試錯誤!函數調用時ESP的值不正確

Debug error! 

The value of ESP was not properly saved across a function call. 
This is usually a result of calling a function declered with one calling 
convention with a fonction pğointer declered with a different calling convention. 

代碼:

typedef int(*FPROC)(char*,char*,char*,char*,char*,int,int); 
HINSTANCE hDllInstance; 
FPROC pmyfonk; 
hDllInstance = LoadLibrary(TEXT("mydll.dll")); 
if (hDllInstance==NULL) {MessageBox("...dll yok............"); 
exit(0); 
} 

pmyfonk=(FPROC)GetProcAddress(hDllInstance,TEXT("myfonk")); 
pmyfonk(TEXT("xxx"),TEXT("xxy"),TEXT("xxz"),NULL,TEXT("xy"),1,1);//this function is working.But,I'm getting upper error. 

FreeLibrary(hDllInstance); 
+1

你能展示DLL的函數聲明嗎? –

+0

有何建議? – user980020

+0

@ user980020實際上沒有'GetProcAddress'的unicode版本,所以你不應該使用'TEXT()'宏作爲它的第二個參數。另外,因爲函數類型'FPROC'只接受'char *',所以在調用'pmyfonk'時不應該使用宏,否則當'UNICODE'被設置時編譯將失敗。 –

回答

2

你應該檢查了這一點:http://msdn.microsoft.com/en-us/library/k2b2ssfy.aspx

有一個在你的代碼某處調用約定不匹配。我是Windows編程的新手,所以我不知道更多,但這顯然是錯誤信息告訴的。

+0

myfonk的簽名不是FPROC,他可能缺少'__cdecl'或'__stdcall',不知道是哪一個。 –

3

默認情況下,使用__cdecl調用約定。我想你的DLL函數使用__stdcall約定。不同之處在於必須使用__cdecl和__stdcall通過調用者清理堆棧。我認爲你搞砸了這樣的事情。 Here you can find這些慣例的很好的解釋。

相關問題