程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> DLL 調用錯誤 -The value of ESP was not properly saved across a f

DLL 調用錯誤 -The value of ESP was not properly saved across a f

編輯:關於C語言

Jeffrey Magder | reply 2003-07-08 21:53
I was having the same problem, but I just FIXED it. I was getting the same error from the following code:

HMODULE hPowerFunctions = LoadLibrary("Powrprof.dll");
typedef bool (*tSetSuspendStateSig)(BOOL, BOOL, BOOL);

tSetSuspendState SetSuspendState = (tSuspendStateSig)GetProcAddress(hPowerfunctions, "SetSuspendState");

result = SetSuspendState(false, false, false); <---- This line was where the error popped up.

After some investigation, I changed one of the lines to:

typedef bool (WINAPI*tSetSuspendStateSig)(BOOL, BOOL, BOOL);

which solved the problem. If you take a look in the header file where SetSuspendState is found (powrprof.h, part of the SDK), you will see the function prototype is defined as:

BOOLEAN WINAPI SetSuspendState(BOOLEAN, BOOLEAN, BOOLEAN);

So you guys are having a similar problem. When you are calling a given function from a .dll, its signature is probably off. (In my case it was the missing WINAPI keyword).

Hope that helps any future people! :-)

Cheers. 

Dheeraj | reply 2003-08-21 23:25 

 

 

只所以會產生這種原因,這位老外沒有深入解釋。

 

產生這個問題是由於調用第三方DLL引起的。

如下DLL導出函數注意那個 __stdcall)

extern "C" __declspec(dllexport) __stdcall int myAdd(int,int);
extern "C" __declspec(dllexport) __stdcall AnsiString aboutMe(void);

 

 __stdcall的意識是

被這些修飾關鍵字修飾的函數,其參數都是從右向左通過堆棧傳遞的(__fastcall 的前面部分由ecx,edx傳), 函數調用在返回前要清理堆棧,但由調用者還是被調用者清理不一定。如果在加載這個DLL並且引入函數時使用如下形式 typedef int(*lpAdd)(int a,int b);HINSTANCE HmyDLL=LoadLibrary(_T("myDLL.dll"));  lpAdd  tAdd =(int  (*)(int,int))P;
     int n=tAdd(10,20);//這一步就會出錯!!!!只所以使用上面老外說的WINAPI可以,如下形式 typedef int(WINAPI  *lpAdd)(int a,int b);HINSTANCE HmyDLL=LoadLibrary(_T("myDLL.dll"));  lpAdd  tAdd =(int  (WINAPI  *)(int,int))P;  int n=tAdd(10,20);//這次不會出錯!!!是因為#define WINAPI      __stdcall因此在導出DLL的函數中使用了__stdcall方式導出的話,在導入DLL函數的調用中函數聲明前同樣要使用__stdcall聲明。如果導出DLL的函數導出沒有使用__stdcall的,那麼導入DLL的函數同樣不需要使用__stdcall,否則也會報上面的錯誤。 

 

本文出自 “風清揚song” 博客,請務必保留此出處http://2309998.blog.51cto.com/2299998/1273090

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved