gpt4 book ai didi

C - 从非托管 DLL 正确导入 stdcall 函数

转载 作者:行者123 更新时间:2023-11-30 15:30:51 26 4
gpt4 key购买 nike

我试图通过创建指定我需要使用的函数的 .def 文件,将函数从非托管 DLL 导入到 C 项目中。我正在练习 user32.dll 中的 WinAPI 函数 MessageBoxA。与其他 WinAPI 函数一样,它是一个 stdcall 函数。以下是我创建 .def 文件的方法:

LIBRARY user32.dll
EXPORTS
_MessageBoxA@16

然后我从中创建一个 .lib,如下所示: lib/def:"C:\Path\to\def\user32.def"/
out:"C:\path\to\project\user32-mb.lib"
成功创建 user32-mb.libuser32-mb.exp 。然后,在我的 C 项目中,我执行以下操作:

#pragma comment(lib, "user32-mb.lib")

#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

EXTERNC __declspec(dllexport) int __stdcall MessageBoxA(void *hWnd, char *lpText, char *lpCaption, int uType);

void main(){
MessageBoxA(0, "MessageBox test", "MessageBox test", 0x00000030L);
}

但是,链接时出现以下错误:

错误LNK2019:函数_main中引用了无法解析的外部符号_MessageBoxA@16

但是,当我将 .def 中的声明更改为:

LIBRARY user32.dll
EXPORTS
MessageBoxA

并将我的 C 代码中的函数原型(prototype)更改为 cdecl 而不是 stdcall:

EXTERNC __declspec(dllexport) int __cdecl MessageBoxA(void *hWnd, char *lpText, char *lpCaption, int uType);消息框实际上出现了,但在关闭时,它抛出一个错误:

运行时检查失败 #0 - ESP 的值未在函数调用期间正确保存。这通常是用一种调用约定声明的函数和用另一种调用约定声明的函数指针调用的结果。这表明使用 cdecl 调用它也是一个坏主意,因为它毕竟需要 stdcall

问题是,我应该在 .def 文件或项目中更改哪些内容才能避免这两个错误并正确导入和调用 stdcall 函数?

最佳答案

您需要将 __declspec(dllexport) 更改为 __declspec(dllimport),因为您是从 DLL 导入函数,而不是导入函数>导出它们:

EXTERNC __declspec(dllimport) int __stdcall MessageBoxA(void *hWnd, char *lpText, char *lpCaption, int uType);
^^

关于C - 从非托管 DLL 正确导入 stdcall 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25317002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com