DLL 调用错误 -The value of ESP was not properly saved across a function call

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,否则也会报上面的错误。
 

 

你可能感兴趣的:(function,problem,getting,following,properly)