开发者

extern "C" not working as expected

I am trying to hook a Win32 API function. I am making a DLL from which I want to export the function, but I am already failing at the basics. My declaration is as follows:

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

but the exported function name is not "fnTest" - as I would expect - but is "_fnTest@0". I can only make it work when declaring the functions calling convention to __cdecl, which results to an exported name of "fnTest"开发者_如何学编程, but since the Win32 calling conection is WINAPI/__stdcall this is not an option.

I am using VS2010. Thanks in advance.


That mangling is part of the __stdcall convention. As the called function has the responsibility to remove the parameters from the stack on return, and removing the wrong amount of data from the stack has disastrous consequences, the number of bytes the parameters take is simply appended to the function name after "@" to let the linker catch potential conflicting definition errors.

Could you explain exactly, how does this pose a problem?


You should use module definition file (.def) instead of __declspec(dllexport).
Just use the following .def file:

EXPORTS
fnTest


If you want to do this you will have to export the functions by ordinal rather than by name using a .DEF file.

stdcall provides a decoration that describes the length of the parameters, in this case @0 since you have no parameters. If you had one parameter it would be @4, and so on.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜