fanfanxiaozu 2011-05-20
“回调机制”是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
THDFunction= function(I:integer;s:string):integer; stdcall;
对于过程的声明:
type
THDProcedure=procedure(s:string); stdcall;
2、 然后根据此原形定义一个相应的函数或过程,对于这个函数或过程来说名字没有什么要求,对函数其参数的类型和返回值的类型必须和定义的回调函数类型完全一致,对于过程来说,只需要其参数类型一样就可以了。
例:根据上面的函数和过程的原形定义一个相应的函数和一个相应的过程。
函数原形定义:
Function HdFunExample(k:integer,sExam:string):integer; stdcall;
过程定义:
procedure HdProExample(sExam:string);stdcall;
3、 在程序中实现此回调函数或着过程;
Function HdFunExample(k:integer,sExam:string):integer; stdcall; Begin End; procedure HdProExample(sExam:string);stdcall; begin end;
4、 调用过程;
回调函数一般作为系统的某个函数的入口地址;
根据调用函数的原形:
假设有如下调用函数:
function DyHdFunExample(HdFun:THDFunction;I:integer):boolean;
注:
在调用函数中通过对函数指针的处理可以直接调用回调函数(即调用函数中的那个是回调函数类型的参数,直接操作它),使回调函数履行一定的操作。即在调用函数中实现回调函数的功能。