Winapi 动态DLL和ESP损坏

Winapi 动态DLL和ESP损坏,winapi,dll,Winapi,Dll,我正在学习使用动态DLL。我在DLL库中创建了2个函数: DWORD fn1(VOID); DWORD fn2(WCHAR*); 并使用def文件将其导出 EXPORTS fn1 fn2 当我加载并使用fn1时,一切正常,但第二个问题导致运行时检查失败#0-ESP的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数,并使用另一种调用约定声明的函数指针的结果。 指针的定义如下: typedef DWORD (WINAPI *fn1)(void); typedef DWORD (W

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

DWORD fn1(VOID);
DWORD fn2(WCHAR*);
并使用def文件将其导出

EXPORTS
fn1
fn2
当我加载并使用fn1时,一切正常,但第二个问题导致运行时检查失败#0-ESP的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数,并使用另一种调用约定声明的函数指针的结果。

指针的定义如下:

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

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

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

您在
fn1
中没有使用它,因为它没有任何参数,因此错误的调用约定不会使堆栈失衡。它适用于
fn2
。生成的代码不会按照uu cdecl的要求在函数调用后将传递的参数弹出堆栈

删除WINAPI以进行修复