0

我正在尝试挂钩 Win32 API 函数。我正在制作一个我想从中导出函数的 DLL,但我已经在基础方面失败了。我的声明如下:

extern "C" __declspec(dllexport) int WINAPI fnTest(void);

但导出的函数名不是“fnTest”——正如我所料——而是“_fnTest@0”。我只能在将函数调用约定声明为 时使其工作__cdecl,这会导致导出名称为“fnTest”,但由于 Win32 调用连接WINAPI/__stdcall不是一个选项。

我正在使用VS2010。提前致谢。

4

3 回答 3

3

这种修改是__stdcall约定的一部分。由于被调用的函数有责任在返回时从堆栈中删除参数,并且从堆栈中删除错误的数据量会带来灾难性的后果,因此参数占用的字节数只是简单地附加到函数名后面的“@”之后让链接器捕获潜在的冲突定义错误。

您能否准确解释一下,这会造成什么问题?

于 2010-11-13T12:49:03.540 回答
1

您应该使用模块定义文件 (.def) 而不是__declspec(dllexport).
只需使用以下 .def 文件:

EXPORTS
fnTest
于 2010-11-13T12:54:56.393 回答
0

如果你想这样做,你将不得不使用 .DEF 文件 按序号而不是按名称导出函数。

stdcall提供描述参数长度的装饰,在这种情况下,@0因为您没有参数。如果您有一个参数,它将是@4,依此类推。

于 2010-11-13T12:46:31.583 回答