动态调用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,非常常见。