Delphi基础 回调函数及其使用
创始人
2024-07-29 17:40:54
0

“回调机制”是window 在执行某个API函数的过程中,调用指定的一个函数(回调函数)。

比如:你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数(Callback Function)。

简单说就是,由程序员编写的,给windows系统(API)调用的函数。 也就是说,函数的功能有你定,调用有windows系统(API)调用。

回调函数就是通过函数的指针来调用的函数。对于一个传递给其他函数的参数,如果你传递的是一个函数的指针(也就是地址),当这个指针被用来调用这个函数时,就可以说是构造了一个回调函数。就是你把自定义函数地址给别人,别人调用你的函数。

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

1. 回调函数是由开发者按照一定的原型进行定义的函

2. 回调函数并不由开发者直接调用执行

3 .回调函数通常作为参数传递给系统API,由该API来调用。

4. 回调函数可能被系统API调用一次,也可能被循环调用多次。

回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.

前者的例子如WriteFileEx,ReadFileEx等,函数的***一个参数是一个回调函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为 EnumDisplayModes本身并不知道用户要如何处理.能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.

这就是所谓的plugin.使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。

1。比如在内核编程中,驱动程序就要提供一些回调函数,当一个设备的数据读写完成后,让系统调用这些回调函数来执行一些后续工作。

2。回调函数和其他函数没什么区别,只是有固定的参数和调用约定,比如windows的回掉函数都要用stdcall. 参数是由调用这个回调函数的函数传递的,当然要规定好参数格式。使用很简单,就是传递这个回调函数的地址给调用的函数作为一个参数。比如创建线程的时候就是这样的 。

3。回调函数的使用主要在于windows原有的API函数,但对于用户的自定义的调用函数一般在于动态连接库中。常规的同一个工程下面一般不需要使用回调函数。(个人认为).。

使用回调函数需要注意的地方:

1、 定义一个回调函数类型,跟一般的函数过程的定义并没有什么区别,但其定义必须根据需要满足回调函数的函数要求,唯一的区别在于在函数或过程的定义后面必须声明其为windows标准调用;
例:
对于函数的声明:

type

  1. THDFunction= function(I:integer;s:string):integer; stdcall; 

对于过程的声明:

type

  1. THDProcedure=procedure(s:string); stdcall; 

2、 然后根据此原形定义一个相应的函数或过程,对于这个函数或过程来说名字没有什么要求,对函数其参数的类型和返回值的类型必须和定义的回调函数类型完全一致,对于过程来说,只需要其参数类型一样就可以了。

例:根据上面的函数和过程的原形定义一个相应的函数和一个相应的过程。

函数原形定义:

  1. Function HdFunExample(k:integer,sExam:string):integer; stdcall; 

过程定义:

  1. procedure HdProExample(sExam:string);stdcall; 

3、 在程序中实现此回调函数或着过程;

  1. Function HdFunExample(k:integer,sExam:string):integer; stdcall;  
  2. Begin  
  3. End;  
  4. procedure HdProExample(sExam:string);stdcall;  
  5. begin  
  6. end; 

4、 调用过程;

回调函数一般作为系统的某个函数的入口地址;

根据调用函数的原形:

假设有如下调用函数:

  1. function DyHdFunExample(HdFun:THDFunction;I:integer):boolean; 

注:

在调用函数中通过对函数指针的处理可以直接调用回调函数(即调用函数中的那个是回调函数类型的参数,直接操作它),使回调函数履行一定的操作。即在调用函数中实现回调函数的功能。

调用:

  1. var 
  2. I:integer;  
  3. begin  
  4. I:=DyHdFunExample(@HdFunExample,i);  
  5. //…….  
  6. End; 

【编辑推荐】

  1. C++回调函数代码示例解读
  2. 6.4.3 利用dojo.Deferred注册回调函数
  3. 讲解如何实现C#回调函数
  4. C/C++中回调函数初探
  5. 1.4.7 HelloWDM对其他IRP的回调函数

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...