CALLBACK(__stdcall)调用方式

今天写一个程序,用到HOOKPROC,HOOKPROC的定义是必须使用CALLBACK定义的。结果我在写一个键盘钩子的时候忘记了加上CALLBACK,也正是因为没有加CALLBACK,使我在__declspec(dllexport)后这个函数在DLL中的名字也没有变形,一般加了CALLBACK后,即使声明为extern “C”也没用,必须要用上module definition file 来LINK才行。这是等会儿讲。先说漏了这个CALLBACK的事情。我写好了DLL,dumpbin一看函数都导出了。于是在主程序中开始LoadLibrary GetProcAddress等。这里要说一下GetProcAddress这个函数,其返回值是FARPROC,FARPROC的定义中是有WINAPI的,也就是__stdcall的,但是如果要求从DLL中Get一个没有__stdcall定义的函数出来也不会有问题。然后传给HOOKPROC类型的函数指针也没问题。于是这样就把一个原本没有CALLBACK的函数用于了SetWindowHookEx。而要是没有这样一圈兜下来。原本将没有__stdcall定义的函数传给SetWindowHookEx是会编译错误的。这里错误主要还是在将FARPROC的函数强转成了HOOKPROC。导致最后我的程序对于键盘事件总是没有钩住。可能在,还有莫名奇妙的crash,最后甚至蓝屏了,SYSTEM_SERVICE_EXCEPTION(0x3B)。后来仔细看了HOOKPROC的声明,发现了CALLBACK,加上。这次是自己基本功差了。发现DLL的名字总是不能以C方式输出。其实加了extern “C”后对于__stdcall的函数还是会加上一些修饰的,形如_Function@2,要彻底没有修饰,仅以Function名字出现还需要在LINK时加上/DEF:”hooh.def” (在VS的LINK中的INPUT中有Module definition file)。这样名字就对了。问题就都解决了。

By Lu Jun

80后男,就职于软件行业。习于F*** GFW。人生48%时间陪同电子设备和互联网,美剧迷,高清视频狂热者,游戏菜鸟,长期谷粉,临时果粉,略知摄影。

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.