回调函数和钩子函数
来源:互联网 发布:软件计算工程造价步骤 编辑:程序博客网 时间:2024/05/18 04:01
什么是回调函数?
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
为什么要使用回调函数?
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为 int )的被调用函数。
如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、 shell 排序、 shake 排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型( int 、 float 、 string ),此时,该怎么办呢?可以使用函数指针,并进行回调。
回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上, SetTimer() API 使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。
另一个使用回调机制的 API 函数是 EnumWindow() ,它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。 EnumWindow() 并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
不管怎么说,回调函数是继续自 C 语言的,因而,在 C++ 中,应只在与 C 代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在 C++ 中应使用虚拟方法或函数符( functor ),而不是回调函数。
什么是钩子函数?
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。
也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事: 1. 声明; 2. 定义; 3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。 声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS系统,不要把它当作你的某个类的成员函数 回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。回调函数使用是必要的,在我们想通过一个统一接口实现不同的内容,这时用回掉函数非常合适。比如,我们为几个不同的设备分别写了不同的显示函数:void TVshow(); void ComputerShow(); void NoteBookShow()...等等。这是我们想用一个统一的显示函数,我们这时就可以用回掉函数了。void show(void (*ptr)()); 使用时根据所传入的参数不同而调用不同的回调函数。
- 回调函数和钩子函数
- 钩子函数和回调函数
- 回调函数和钩子函数
- 钩子函数和回调函数
- 回调函数和钩子函数
- 钩子函数和回调函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 回调函数和钩子函数
- 钩子函数---回调函数
- 回调函数 钩子函数
- 回调函数/钩子函数
- 关于回调函数和钩子函数基础知识的整理
- C#操作文件(文件读写),这次示例操作txt文件,其他格式一个原理
- 如何增加Exchange Server 2003 Service Pack 2 Standard Edition(标准版)的 18 GB 数据库大小限制
- ZOJ1251
- asp.net正则表达式提取网页网址、标题、图片实例以及过滤所有HTML标签实例
- linux不同用户环境变量问题
- 回调函数和钩子函数
- 编译android源码时错误提示:"duplicate entry: xxx.xx"
- axis的soap监控
- 探索C++的秘密之详解extern "C"
- 水晶报表2011-04-29实战总结(子报表)
- 函数参数的传递问题(指针的指针)(转)
- 文档注释
- Canvas教程(6):组合 Compositing
- JAVA中的文件选择控件