动态调用DLL,加载没有问题,但在调用函数时,出现下面的错误 i386\chkesp.c line:42

动态调用DLL,加载没有问题,但在调用函数时,出现下面的错误

program
module
file:   i386\chkesp.c
line:42

the   value   of   ESP   was   not   properly   saved   acorss   a   function   call.
This   is   usually   a   result   of   calling   a   functino   declared   with
one   calling   convention   with   a   function   pointer   declared   with   a
different   calling   convention

由于DLL由别人提供,不能更改,所以比较困惑。。。。

解决办法:

typedef   int   (*   yourFunc)(yourParam1,yourParam2…);

换成typedef   int   (__stdcal*   tcpinitDLL)(yourParam1,yourParam2…);

这里的__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__stdcall表示:
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。



发表评论

邮箱地址不会被公开。