extern“C”没有按预期工作

时间:2010-11-13 12:35:21

标签: c++ extern

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

你能准确解释一下,这是怎么造成问题的?

答案 1 :(得分:1)

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

EXPORTS
fnTest

答案 2 :(得分:0)

如果要执行此操作,则必须使用export the functions by ordinal而不是使用.DEF文件的名称。

stdcall提供了一个描述参数长度的装饰,在本例中为@0,因为您没有参数。如果你有一个参数,它将是@4,依此类推。