- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C回调函数经典详解C回调函数经典详解
我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调
处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在
机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢?
使用回调函数实际上就是在调用某个函数(通常是API 函数)时,将自己的一
个函数(这个函数为回调函数)的地址作为参数传递给那个函数。
而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个
机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体
使用的API 函数有关,一般在帮助中有说明回调函数的参数和返回值等。C++
中一般要求在回调函数前加CALLBACK (相当于FAR PASCAL ),这主要是说
明该函数的调用方式。
至于钩子函数,只是回调函数的一个特例。习惯上把与SetWindowsHookEx
函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx 安装的
函数称为钩子函数,不过这种叫法不太流行。
也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你
设定的条件时自动调用。为此,你需要做三件事:
1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为
一个参数,以便于系统调用。
声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS
系统,不要把它当作你的某个类的成员函数。
,回调函数、消息和事件例程
调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用
者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。
CPU 为此准备 现成的调用指令,调用时可以压栈保护现场,调用结束后从堆
栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使
调用者和被调者可以互不相识,于是才有 后来的函数和构件。
此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美
餐,其烹制者应对食客 如指掌,但实情并非如此。例如,写一个快速排序函数
供他人调用,其中必包含比较大小。麻烦来 :此时并不知要比较的是何类数据
--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通
行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一
个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,
并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借
指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函
数(够咬嘴的),故称其为回调(callback)。
回调函数使程序结构乱了许多。Windows API 函数集中有不少回调函数,
尽管有详尽说明,仍使初学者一头雾水。恐怕这也是无奈之举。
无论何种事物,能以树形结构单向描述毕竟让人舒服些。如果某家族中孙辈又是
某祖辈的祖辈,恐怕无人能理清其中的头绪。但数据处理之复杂往往需要构成网
状结构,非简单的客户/服务器关系能穷尽。
Windows 系统还包含着另一种更为广泛的回调机制,即消 机制。消 本
是 Windows 的基本控制手段,乍看与函数调用无关,其实是一种变相的函数
调用。发送消 的目的是通知收方运行一段预先准备好的代码,相当于调用一个
函数。消息所附带的 WParam 和 LParam 相当于函数的参数,只不过比普通
参数更通用一些。应用程序可以主动发送消 ,更多情况下是坐等 Windows 发
送消 。一旦消 进入所属消 队列,便检感兴趣的那些,跳转去执行相应的消
处理代码。操作系统本是为应用程序服务,由应用程序来调用。而应用程序一
旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种
广义回调。其实,应用程序之间也可以形成这种回调。假如进程 B 收到进程 A
发来的消 ,启动 一段代码,其中又向进程 A 发送消 ,这就形成 回调。
这种回调比较隐蔽,弄不好会搞成递归调用,若缺少终止条件,将会循环不已,
直至把程序搞垮。若是故意编写成此递归调用,并设好终止条件,倒是很有意思。
但这种程序结构太隐蔽,除非十分必要,还是不用为好。
利用消息也可以构成狭义回调。上面所举排序函数一例,可以把回调函数地
址换成窗口 handle。如此,当需要比较数据大小时,不是去调用回调函数,而
是借 API 函数 SendMessage 向指定窗口发送消 。收到消 方负责比较数
据大小,把比较结果通过消 本身的返回值传给消息发送
您可能关注的文档
- --类的设计与封装(一)实验报告--类的设计与封装(一)实验报告.doc
- -下初中一年级下册新课标期中试卷及答案-下初中一年级下册新课标期中试卷及答案.doc
- -习题班-第4章-招投标-习题班-第4章-招投标.doc
- -五(上)数学第三单元《公因、公倍数练习课》课件12-五(上)数学第三单元《公因、公倍数练习课》课件12.ppt
- -公边消警化学真题与详解-公边消警化学真题与详解.pdf
- -北京石景山八年级(下)期末数学试卷及答案-北京石景山八年级(下)期末数学试卷及答案.pdf
- -外研版英语八年级下册Module 7~8过关测试卷-外研版英语八年级下册Module 7~8过关测试卷.doc
- -央财199管理类联考逻辑推理与写作真题-央财199管理类联考逻辑推理与写作真题.pdf
- -南京地拍情况 0202-南京地拍情况 0202.doc
- -学年人教新课标四川省攀枝花市七年级地理上册期末考试-学年人教新课标四川省攀枝花市七年级地理上册期末考试.pdf
- Module3Unit2Thisyearwearetrainingmorecarefully.课件英语八年级上册.pptx
- 人类的聚居地聚落七年级地理上册课件(人教版)(精改版)(完整版)3.pptx
- Unit1Ourschoolsubject(2)四年级英语下册译林版三起(精)2.pptx
- 人物角色设计与动漫创作 (2).pptx
- 2024年中考英语三轮冲刺高频核心词汇及常见句式表达天天练DAY16.docx
- 第二章物质转化与材料利用复习练习浙教版九年级上册科学.docx
- 科学实验室or科学博物馆?—幼儿园科学区的存在问题.pdf
- 紧急医学救援培训大纲及理论内容.pdf
- 江苏开放大学 大三 大学英语(A) 形成考核作业二.pdf
- B5学习小组组织与管理作业2—技术使用记录(小学数学).pdf
最近下载
- (高清版)B 15982-2012 医院消毒卫生标准.pdf VIP
- 医院护理人员绩效考核评价制度.doc VIP
- JTG E 20-2011公路工程沥青及沥青混合料试验规程释义手册_(高清-无水印).pdf
- 初中英语新外研版七年级上册Unit 1 A new start课文讲解(2024秋).doc
- 可爱的四川 主题一:自然之美 第1课 享誉世界的超级明星-国宝大熊猫 教案.doc
- 机械安全培训PPT课件.ppt
- 昌吉市新联煤矿煤矿施工组织设计修改版.doc VIP
- 【精品课件】 苏科版信息技术五年级全一册 第3课 火柴人跳舞.ppt VIP
- ASME-B1.3-2007-个人中文翻译(仅供参考).docx VIP
- 《全面质量管理》习题集.docx VIP
文档评论(0)