动态加载DLL后, 调用出错

来源:互联网 发布:mac连接wifi经常断线 编辑:程序博客网 时间:2024/05/22 10:52
动态加载DLL后, 调用出错


动态加载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方式。