
首先做一个形象的比喻:,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中d出。理解回调函数 程序在调用一个函数(function)时(通常指api)相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下: call(调用) program --------------------→ dll 程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数)需要回调函数的 DLL 函数往往是一些必须重复执行某些 *** 作的函数关系表示如下: call(调用) program --------------------→ dll ↑ ¦ ¦_______________________________¦ callback(回调) 当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的 *** 作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用! 也有这样的说法(比较容易理解): 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事: 1 声明; 2 定义; 3 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。NET Framework 开发人员指南 回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。 回调函数和实现要从托管代码中调用大多数 DLL 函数,可创建该函数的托管定义,然后调用该函数。此过程比较直接。 要使用需要回调函数的 DLL 函数,则会有一些附加的步骤。首先,必须在文档中查阅该函数,确定该函数是否需要回调。接着,必须在托管应用程序中创建回调函数。最后,调用该 DLL 函数,并将指向回调函数的指针当作参数进行传递。右图总结了这些步骤。 回调函数非常适合在重复执行任务的情况下使用。
CALLBACK函数,即回调函数,是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
实现的机制:
1、定义一个回调函数;
2、提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
3、当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
扩展资料:
1、回调函数必须有关键词 CALLBACK;
2、回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数
3、回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点)
4、回调函数通常作为参数传递给系统API,由该API来调用
5、回调函数可能被系统API调用一次,也可能被循环调用多次
参考资料:
回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这一设计允许了底层代码调用在高层定义的子程序。回调的形式因程序设计语言的不同而不同。(C, C++ and Pascal允许将函数指针作为参数传递给其它函数。其它语言,例如JavaScript,Python,Perl和PHP,允许简单的将函数名作为参数传递。Objective-C中允许利用@selector关键字传递SEL类型的函数名。)
回调允许函数调用者在运行时调整原始函数的行为。因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。
回调函数使得程序设计更加灵活。
typedef struct
{
int a;
void (pshow)(int);
}TMP;
void func(TMP tmp)
{
if(tmp->a >10)//如果a>10,则执行回调函数。
{
(tmp->pshow)(tmp->a);
}
}
void show(int a)
{
printf("a的值是%d\n",a);
}
void main()
{
TMP test;
testa = 1;
testpshow = show;
func(&test);
}
这只是举例,一般回调函数的用法为:
甲方进行结构体的定义(成员中包括回调函数的指针)
乙方定义结构体变量,并向甲方注册,
甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。
回调函数 就是上层调用 设置下去
底层通过函数指针调用上层函数
多文件中才有用 单文件可以模拟
比如
#include <stdioh>typedef void (pFuncCb) (int);//定义回调函数。
void callback1(int a)
{
printf("callback function1 is called and parameter = %d\n", a);//打印1
}
void callback2(int a)
{
printf("callback function2 is called and parameter = %d\n", a);//打印2
}
pFuncCb callback_function;
void lowerFunc(int n)
{
int i;
for(i = n; i < n+10; i ++)
if(callback_function) callback_function(i);
}
int main()
{
callback_function = callback1;
lowerFunc(1);// 会打印十次 打印1, 1到10
callback_function =NULL;
lowerFunc(10);//没有打印。
callback_function = callback2;
lowerFunc(100);// 会打印十次 打印2, 100到110
return 0;
}
回调函数用于异步 *** 作中,就是让系统等待某个事件发生,并且告诉系统,事件发生后用哪个函数去处理,这个函数就叫回调函数,事件发生后,系统自动调用这个函数。而程序可以去做其它事件,不用等待事件。
这里WndProc这个函数就是告诉系统,接收到消息后就这个函数来处理。
HWND hWnd 这个参数不能不设,因为系统调用这个函数时是认为有这个参数的,你不设,调用就会出错,这是回调函数,是系统来调用,而不是你自己去调用。
你不用管这个问题,虽然WNDCLASS定义是在CreateWindow之前,但CreateWindow之前是没有消息的,所以不会调用WndProc,也就不会出错。wndClasslpfnWndProc = WndProc;只是让系统知道消息函数的地址在哪里,在没有调用DispatchMessage(&msg); 之前是不会调用WndProc的。
这样解释不是很好,希望你能理解。很不错哦,你可以参考下的
2011-7-22 23:09:26
普通函数与回调函数的区别:
对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”
对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
在前端开发中,回调函数是一种被传递给其他函数的函数,这些函数会在另一个函数执行完毕后被调用。回调函数通常用于处理异步 *** 作,如 AJAX 请求或事件处理程序。回调函数可以让开发者在一定程度上控制程序的流程,以便在需要时执行特殊 *** 作。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)