0

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

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" ); 

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

4

1 回答 1

2

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

你侥幸逃脱,fn1因为它没有任何参数,所以调用约定错误不会导致堆栈不平衡。它适用于fn2. 生成的代码不会按照 __cdecl 的要求在函数调用后将传递的参数从堆栈中弹出。

删除 WINAPI 进行修复。

于 2012-10-23T17:07:01.580 回答