回调函数和钩子函数

来源:互联网 发布:网易我的世界java 编辑:程序博客网 时间:2024/05/17 21:27
所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。例子:void CALLBACK fun(){...} 这是一个函数,回调函数void AAA(int a, Fun* p); 这是一个普通函数,但第二个参数是funAAA(5, fun);  钩子函数,严格算起来,也算是回调函数的一种。但钩子函数是针对的截取的,当你使用了钩子之后,每当触发到相对应的消息,系统就会先“执行你写的回调函数”。即原本是:系统-->目标函数使用钩子就变成:系统-->你写的回调函数-->目标函数----------------------------------我是分割线-------------------------------回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址(函数指针)作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数(自己写的这个函数)中处理消息或完成一定的操作。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。要实现Win32的系统钩子,必须调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,这个函数的原型是HOOK   SetWindowsHookEx(int   idHook,HOOKPROC   lpfn,HINSTANCE   hMod,DWORD   dwThreadId);,其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。两者的本质都是通过指针预加载特定的模块处理特定的消息,但是功能的目的性不同:函数指针主要是对收到消息进入模块执行特定流程, 钩子函数主要目的是提前截获消息,越过预先定义的消息处理机制,重新定义消息处理模块。
0 0
原创粉丝点击