2012-10-23 59 views
0

我正在学习使用动态DLL。我创建了2个功能我dll库:动态DLL和ESP损坏

DWORD fn1(VOID); 
DWORD fn2(WCHAR*); 

,并出口其高清使用文件

EXPORTS 
fn1 
fn2 

当我加载&使用FN1,一切都很好,但第二个是造成问题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.

指针被定义为:

typedef DWORD (WINAPI *fn1)(void); 
typedef DWORD (WINAPI *fn2)(WCHAR*); 

并加载这样的:

fn1 first = NULL; 
fn2 second = NULL; 
first = (fn1) GetProcAddress(dll, "fn1"); 
second = (fn2) GetProcAddress(dll, "fn2"); 

你能帮助我,什么可能导致问题 - 当我“继续”应用程序正常工作......

回答

2

显然函数指针类型的声明是不正确的。它与你的代码片段不匹配,你将它们声明为WINAPI。这是一个将其调用约定设置为__stdcall的宏。然而,你没有声明具有相同属性的实际功能。缺省值是__cdecl。

因为它没有任何参数,所以你得到了fn1,所以调用约定错误不会不平衡堆栈。它适用于fn2。生成的代码不会像__cdecl所要求的那样在函数调用后从堆栈中弹出传递的参数。

删除WINAPI进行修复。