动态加载DLL后, 调用出错
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
排查:
只要该DLL函数有参数都会报错.
一下子联想到: __stdcall和 __cdecl的问题.
例如:
原来是这么声明:
typedef int (__stdcall *Fun1)(bool bEnable);
现在改为
typedef int (__cdecl *Fun1)(bool bEnable);
调用了一下, 没报错了.
所以在动态加载DLL是, 要注意该DLL导出的函数的声明类型
通常:
MFC的dll默认的入栈方式为 __stdcall方式的
而 Win32 DLL 默认的入栈方式为 __cedcall方式,不是__stdcall方式。
动态加载DLL后, 可以获得函数地址, 但是一调用就报错.
报如下的错误:Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
排查:
只要该DLL函数有参数都会报错.
一下子联想到: __stdcall和 __cdecl的问题.
例如:
原来是这么声明:
typedef int (__stdcall *Fun1)(bool bEnable);
现在改为
typedef int (__cdecl *Fun1)(bool bEnable);
调用了一下, 没报错了.
所以在动态加载DLL是, 要注意该DLL导出的函数的声明类型
通常:
MFC的dll默认的入栈方式为 __stdcall方式的
而 Win32 DLL 默认的入栈方式为 __cedcall方式,不是__stdcall方式。