动态DLL和ESP损坏

时间:2012-10-23 17:00:02

标签: winapi dll

我正在学习使用动态DLL。我创建了2个函数i DLL库:

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

并使用def文件

导出它
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" ); 

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

1 个答案:

答案 0 :(得分:2)

显然,函数指针类型的声明不正确。它在您的代码段中也不匹配,您将它们声明为WINAPI。这是一个将其调用约定设置为__stdcall的宏。但是,您没有声明具有相同属性的实际函数。默认值为__cdecl。

你为fn1得到了它,因为它没有任何参数,因此调用约定错误不会使堆栈失衡。它适用于fn2。生成的代码在__cdecl。

要求的函数调用之后不会将传递的参数弹出堆栈

删除要修复的WINAPI。