学习钩子(Hook)过程中遇到的一些问题

来源:互联网 发布:好的英语听力软件 编辑:程序博客网 时间:2024/05/18 13:09

1 . AFX_EXT_CLASS 是什么

扩展DLL使用 AFX_EXT_CLASS 宏导出类;链接到扩展 DLL 的可执行文件使用该宏导入类。 用于生成扩展 DLL 的相同头文件可通过 AFX_EXT_CLASS 宏与链接到 DLL 的可执行文件一起使用。

在写钩子类的时候需要用到这个关键字。

参考资料:MSDN:使用AFX_EXT_CLASS 导出和导入

2. pragma是什么

它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

参考资料:#pragma 预处理指令详解


3. 定义数据段
#pragma data_seg("mydata")// definition of data which will store in data segment "mydata"#pragma data_seg()

参考资源:《vc++深入详解》【孙鑫】,MSDN: data_seg


4. DEF 文件 是什么
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成 DLL 时,.def 文件最有用。 由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。

参考资料:MSDN:模块定义文件


5. SetWindowsHookEx 函数
函数原型:
HHOOK WINAPI SetWindowsHookEx(  __in  int idHook,  __in  HOOKPROC lpfn,  __in  HINSTANCE hMod,  __in  DWORD dwThreadId);

函数功能:安装钩子
参数解释:
idHook: 安装的钩子类型,例如钩子用来监视鼠标消息,则值为WH_MOUSE,若用来监视键盘消息,则值为WH_KEYBOARD
  lpfn:  钩子程序的处理过程,例如鼠标钩子处理过程的原型为
LRESULT CALLBACK MouseProc(  __in  int nCode,  __in  WPARAM wParam,  __in  LPARAM lParam);

从CALLBACK可以看出这是一个回调函数,当被监视的程序处理鼠标消息时,这个函数会被系统调用,无需我们自己调用。注意函数的名字不一定是MouseProc,但是参数类型要一致。另外,还需要注意,这个函数只能定义成普通的c函数,而不能定义成某个类的成员函数。
hMode: 
dwThreadId:
dwThreadId表示钩子程序要与哪个线程相关联,如果这是一个线程钩子,用于监视本线程及其产生的线程,(例如使用GetCurrentThreadId()函数得到当前线程),那么hMode的值为0;如果这是一个系统钩子,用于监视所有指定类型消息,那么由于系统钩子必须使用独立的动态链接库,dwThreadId的值为0, hMode的值为DLL的DllMain()函数传过来的参数hinstDLL的值,
此函数原型为
BOOL WINAPI DllMain(  __in  HINSTANCE hinstDLL,  __in  DWORD fdwReason,  __in  LPVOID lpvReserved);

关于DLLMain,详见:MSDN: DllMain entry point

其它:
注意钩子使用完毕,要使用UnhookWindowsHookEx函数卸载钩子。
注意钩子处理过程lpfn最后一般需要
return CallNextHookEx(...);

关于CallNextHookEx详见MSDN:CallNextHookEx

6. 使用DLL文件时的设置
   dll文件:复制到使用这个dll文件的应用程序同目录下
   lib文件:以vs2010为例,右击项目 -> 属性 -> 链接器->输入->附加依赖项,将lib文件路径添加进来


注:此文不断更新

全文参考资料:
钩子函数hook
MSDN: Using Hooks


原创粉丝点击