Callback函数详解

article/2025/9/17 12:10:33
http://shiwawa.blog.hexun.com/9925417_d.html 字体变小 字体变大

一,回调函数

我们经常在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。如此,当需要比较数据大小时,不是去调用回调函数&#x


http://chatgpt.dhexx.cn/article/1j56W88h.shtml

相关文章

《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】

目录 前言为什么要进行软件测试什么是软件缺陷1.1 什么是软件测试1.2 软件测试与CMMI软件质量保证SQA与软件测试的关系 1.3测试用例1.3.1什么是测试用例测试用例的五大要素测试用例1.3.2测试用例的评价标准1.3.3测试用例设计的基本原则1.3.4测试用例模板 1.4测试环境1.4.1什么是…

群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote)

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote) 蚂蚁笔记是一款特别棒的笔记软件,支持Markdown语法,是程序员必备的软件之一。下面我们就在群晖DS918+的机器上docker出来一个耍耍。 一、下载蚂蚁笔记(leanote)镜…

基于 Qt 框架的开源笔记软件 VNote

关注、星标公众号,直达精彩内容 来源:OSC开源社区 作者:tamlok VNote是一个受Vim启发开发的专门为Markdown而优化、设计的笔记软件。 授权协议:MIT 开发语言:C/C JavaScript HTML/CSS SHELL 操作系统:跨平台…

VisionPro软件笔记

VisionPro笔记 1、CogPMAlignTool的操作方法: 抓取图像-设置训练区域及参数-训练模板-设置运行参数与区域-运行-查看结果 2、CogPMAlignTool的基本原理: 图案位置搜索工具(识别定位)基于边缘特征的模板而不是基于像素的模板匹配…

一款开源的支持离线的支持MarkDown的优秀笔记软件----思源笔记

日常工作中,大家可能会用笔记软件记录自己积累的一些知识,组建自己的知识管理系统,常用的工具可能有云笔记,如有道云笔记,印象笔记等,但是有时候在工作中,信息比较敏感,不能够将信息…

一文了解常用效率记笔记软件(超过20款含有图片和双向链笔记)

前言 Mac 软件推荐下载网址 麦软网:https://www.macfz.com腾讯柠檬:https://lemon.qq.com/lab 更新时间 第七次更新 6 月 28 号 ,对于有道和印象的理解,有时间把这篇文章拆分下第六次更新 5 月 27 号,更新了如何看待…

知识管理软件,有道云笔记的优缺点和C笔记

前言 软件有道云笔记C笔记发布时间2011年6月28日还在内测所属公司网易公司北京创新乐知网络技术有限公司 1.笔记的重要性: 大家有没有一种种感受,我们成日钻研书籍,天天认真听讲,发奋学习,收到的反馈却并不理想&…

OneNote-做笔记的软件-强烈推荐

一、认识电子笔记本 普通笔记本转化为电子笔记本 笔记可以将我们的想法和从外部获取的信息进行归纳和整理,而电子笔记本就是将传统的笔记进行了电子化电子笔记本的优势 可搜索统一管理高效编辑可修改性多端同步主流电子笔记本 OneNoteEver note(印象笔记)Notability…

推荐几款好用的云笔记软件

一直钟爱印象笔记,程序员的电脑上必装的软件,但最近期限到了,再也不能像以前无限制的上传文件,续费也比去年的只要九块九一年高出了很多倍,因此,注册试用了其他的笔记,发现云笔记众多&#xff0…

php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件

更多精彩内容,请关注公众号【平凡而诗意】 ​ 笔记软件是工作和学习过程中经常会用到的软件,会议纪要、工作事项、待办,都需要用到笔记软件,这样能够明确做事的先后顺序,能够提高做事的效率。 笔记软件数不胜数&#x…

软件工程复习笔记 类图

类图 前言1 类图的概念1、类图2、类图的作用3、类图的组成元素 2 UML中的类(1)类的定义(2)类的表示(3)类的命名(4)类的属性&#xff0…

想找一款读书笔记软件?快来试试BookxNote

去年看到网上介绍 BookxNote 是一款做读书笔记的好工具,被誉为“ Windows 端的 MarginNote” 。当时试用了一下感觉挺好,但是在笔记和书籍的存储上还有一些困惑,因此有点顾虑。最近看教程和自己尝试,解决了困惑,在此分…

做笔记软件

做笔记软件 找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) [转载请保留] 版本1.0 编译xbeta/善用佳软 出自 http://blog.sina.com.cn/u/46dac66f01000b57 寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) v1.0 作者: SuperboyAC 编译: xbe…

【笔记软件obsidian】从入门到精通

目录 一.前言 二.下载及安装,基本使用方法 三.完成第一篇笔记(重点) 四.【选修】ios用户如何通过iCloud进行三平台同步 五.基本Markdown语法(一定要看完!) 六.结语 一、前言: 最近被很多同学问到&#xff…

计算机记笔记软件是什么,电脑记笔记软件哪个好(适合学生做笔记的软件)

瞬息万变的世界,软件的更迭也风起云涌。各色各样的软件层出不穷让人眼花缭乱,一次又一次的更新让人应接不暇,还没弄清一个软件的用法又被另一个软件吸引了目光。这种现象无论是在 软件介绍 1. XMind XMind 是一款思维导图软件,他支…

几个离线笔记软件推荐

eDiary 官网:http://www.haoxg.net/ eDiary的作用不仅仅在于写日记,您也可以用它来记流水帐、写工作日志, 记录学习心得,或者用它来管理你的日常文档。eDiary以时间为主线,以文 字为载体,记录你的心路历程…

Notion 程序猿必备笔记软件

我发现工作时间比较久的人,都会逐渐养成记笔记的习惯,我也是,我之前已经使用国内某云笔记8年之久,而且是多年的会员。但我今天要给大家推荐另一款笔记软件——Notion,国内可能Notion的使用还比较少,但它却在…

笔记软件对比

之前一直用的印象笔记和有道云笔记,14年大学毕业的时候用的有道云笔记。积累了很多了。工作后用了印象笔记。mac下面的暗黑模式用得很舒服,奈何windows下界面丑得不要不要的。还不能更换纸张背景。一大片白。 上个月换了工作了,用的公司发的…

离线脱机版个人笔记软件的选择

笔者平时在工作过程中,经常有一些心得体会或者操作手册之类的内容需要记录,之前一直是采用word版本或者网络文章blog等方式予以记录。但是总觉得不是特别方便,要么受限于网络,不方便上网的地方无法使用,要么是文章组织…

离线笔记软件

有道、印象、wolai,onenote,现在市面上的笔记软件林林种种,选择一款适合自己的非常重要。 基本上上面提到的软件笔者都用过,列一下自认为不爽的地方 有道:不开会员不能使用截图粘贴功能,只能老老实实的上传…