我正在尝试挂钩Win32 API函数。我正在制作一个DLL,我想从中导出该函数,但我已经失败了。我的声明如下:
extern "C" __declspec(dllexport) int WINAPI fnTest(void);
但导出的函数名称不是“fnTest” - 正如我所料 - 但是“_fnTest @ 0”。我只能在向__cdecl
声明调用约定的函数时使其工作,这导致导出的名称为“fnTest”,但由于Win32调用连接是WINAPI/__stdcall
,因此这不是一个选项。
我正在使用VS2010。提前谢谢。
答案 0 :(得分:2)
该修改是__stdcall
约定的一部分。由于被调用函数有责任在返回时从堆栈中删除参数,并从堆栈中删除错误数量的数据会带来灾难性的后果,参数所占用的字节数简单地附加到“@”之后的函数名称中让链接器捕获潜在的冲突定义错误。
你能准确解释一下,这是怎么造成问题的?
答案 1 :(得分:1)
您应该使用模块定义文件(.def)而不是__declspec(dllexport)
只需使用以下.def文件:
EXPORTS
fnTest
答案 2 :(得分:0)
如果要执行此操作,则必须使用export the functions by ordinal而不是使用.DEF文件的名称。
stdcall
提供了一个描述参数长度的装饰,在本例中为@0
,因为您没有参数。如果你有一个参数,它将是@4
,依此类推。