您好,欢迎访问三七文档
1、凡是由你设计却由windows系统呼叫的函数,统称为callback函数。某些API函数要求以callback作为你参数之一。如SetTimer,LineDDA,EnumObjects。回调函数是由开发者按照一定的原形进行定义的函数(每个回调函数都必须遵循这个原则来设计)例如:----------------------------------------BOOLCALLBACKDialogProc(HWNDhwndDlg,//handleofdialogboxUINTuMsg,//messageWPARAMwParam,//firstmessageparameterLPARAMlParam//secondmessageparameter);----------------------------------------说明:回调函数必须有关键词CALLBACK;回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数2回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点)3回调函数通常作为参数传递给系统API,由该API来调用4回调函数可能被系统AP。
2、I调用一次,也可能被循环调用多次示范EnumObjects,发现某个DeviceContext的GDIobect符合我们的形态时,呼叫callback函数.假设我们有一个CMycalss如下:classCMyclass{private:intnCount;intCALLBACK_exportEnumObjectsProc(LPSTRlpLogObject,LPSTRlpData);public:voidenumIt(CDC&dc);}voidCMyclass::enumIt(CDC&dc){//註冊callback函式dc.EnumObjects(OBJ_BRUSH,EnumObjectsProc,NULL);}C++编译器针对CMyclass::enumIt实际作出的码相当于:voidCMyclass::enumIt(CDC&dc){//註冊callback函式CDC::EnumObjects(OBJ_BRUSH,EnumObjectsProc,NULL,(CDC*)&dc);}你所看到的最后一个参数其实是this指针,类的成员函数靠着this指针才得以抓到正确对象资料.而nCoun。
3、t=0;其实是this-nCount=0;基于相同的道理,上例中的EnumObjectProc既然是一个成员函数,C++编译器也会为它多准备一个隐藏参数.问题出现,callback函数给windows呼叫用的,windows并不经由任何对象呼叫这个函数,也就无需传递this指针给callback函数,也是导致堆栈中有一个随机参数会成为this指针,而其结果当然是程序的崩溃了.因此要把某个函数作为callback函数,就必须告诉C++编译器,不要放this指针作为该函数的最后一个参数,两个方法可以做到这一点,1.不要使用类的成员函数(也就是说要使用全局函数)作为callback函数.2.使用static成员函数,也就是在函数前加上static修饰词.第一种做法相当于在C语言中使用callback函数,第二种做法接近OO精神.进一步而言,C++中的static函数特性是,即使对象还没有产生,static成员已经存在(函数或参数都如此).换句话说,物件产生之前你已经可以呼叫类的static函数或者使用类的static变量了;也就是说凡是宣告为static的东西,(不管函数或变量)都并不和对象。
4、结合在一起,它们是类的一部分,不属于对象Q刘虎翼:编程工具:C++BUILDER3.0操作系统:WIN98我想在C++中使用回调函数,请问它的内在机制如何,另外怎么定义。我用DialogBox函数时,如何使用回调函数?它和钩子函数有何不同?多谢指教!!!拜托!!!A回答:使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。C++中一般要求在回调函数前加CALLBACK,这主要是说明该函数的调用方式。DialogBox的回调函数实际上是个窗口过程,用来处理所有消息。其定义为:BOOLCALLBACKDialogProc(HWNDhwndDlg,//handleofdialogboxUINTuMsg,//messageWPARAMwParam,//firstmessageparameterLPARAMlParam。
5、//secondmessageparameter);在Win32API中有详细说明。一般使用C++Builder或MFC的往往没有使用SDK编程的经验,建议找一些SDK编程的书看一下,否则很难理解如何使用窗口过程。至于钩子函数,只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数,不过这种叫法不太流行。frank的意见:我对回调函数的理解虽然粗浅,但是我觉得会让人更容易理解:回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS系统。不要把它当作你的某个类的成员函数。ping的意见:frank说:回调函数属于WINDOWS系统。我觉得不应该说回调函数是属于系统的。应该说是程序把这段代码的触发交由系统来做。而这种做法是WINDOWS提供的处理机制吧,因为消息是。
6、系统一手掌握着的,由系统来调用我们的程序对消息的处理部分,这样子会比较方便。不然我们又得花力气去读消息列表了。(不知道我说的对不对,接触系统还不深,请高手指教哦)二.1.BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)表示此函数需要回调函数的线索之一是存在lpEnumFunc参数.如果参数采用指向回调函数的指针,其名称中通常会有lp(长指针)前缀与Func后缀的结合22.创建托管回调函数.该实例声明一个名为Callback委托类型,此委托类型采用两个参数:hwnd和lparam.第一个参数是窗口的句柄;第二个参数由应用程序定义.回调函数通常返回非零值表示成功,非零值表示失败3创建一个委托,并将其作为参数传递给EnumWindows函数。平台调用会自动将委托转换为常见的回调格式。4确保在回调函数完成其工作之前,垃圾回收器不会回收委托。如果委托作为参数进行传递,或者所包含的委托作为结构中的字段进行传递,则该委托在调用期间不会被回收。因此,正如下面的枚举示例所示,回调函数会在调用返回前完成其工作,而无需托管调用方执行额外的操作。然而,如果。
7、可以在调用返回后调用回调函数,则托管调用方必须采取相应的措施来确保委托在回调函数完成其工作之前不会被回收。//Adelegatetype.__delegateboolCallBack(inthwnd,intlParam);//Managedtypewiththemethodtocall.__gcclassEnumReport{//Reportthewindowhandle.public:boolReport(inthwnd,intlParam){Console::Write(LWindowhandleis);Console::WriteLine(hwnd);returntrue;}};[DllImport(user32)]externCintEnumWindows(CallBack*x,inty);voidmain(void){EnumReport*er=newEnumReport;CallBack*myCallBack=newCallBack(er,&EnumReport::Report);EnumWindows(myCallBack,0);}三大家都知道对象是数据和方法的封装体。在。
8、C++中,它们分别表现为数据成员和成员函数。程序设计者通过执行对象的各种方法,来改变对象的状态(即改变对象的属性数据)。从而使该对象发生某些“事件”。当一对象发生某事件时,它通常需向其它相关对象发送“消息”,请求它们作出一些处理。这时,发生事件并向其它对象请求处理的对象被称为“事件对象”,而处理事件的对象被称为“回调对象”。回调对象对事件的处理称为“回调函数”。在C++中,这一过程相当于:当事件对象发生事件时,调用回调对象的某些成员函数。通常的作法是回调对象向事件对象传递对象指针。但这种方法不通用。为了减少程序设计的工作量,本文提出一种建立对象间消息连接的系统方法。它的思路是:将“事件发生→请求处理→执行处理”这一过程抽象成一个“回调”(CallBack)类。通过继承,用户可以轻松获取建立对象间消息连接的机制。一、回调类的数据结构及其成员函数本文提出的CallBack类支持三种回调函数。它们是:回调对象中的成员函数,属于回调类的静态成员函数和普通的C函数。CallBack类中包含一回调函数表CallBackList。它用于记录事件名称,指向回调函数及回调对象的指针。该表的每一个节点为一。
9、个事件记录EventRecord。每个事件记录包含三个域:事件名指针eventName,指向回调对象的指针pointerToCBO,指向回调函数的指针pointerToCBF或pointerToCBSF(其中,pointerToCBF指向回调对象的成员函数,pointerToCBSF指向回调类的静态成员函数或普通函数。它们同处于一共用体内)。CallBack类所提供的回调机制是这样的:在事件对象上注册回调对象中的回调函数;当事件发生时,事件对象在其回调表中检索并执行回调函数。从而使二者的消息连接得以建立。(关于该类的具体实现,请参阅文后所附的程序清单)回调对象事件对象事件名回调对象指针回调函数指针“event”pointerCBOpointerToCBF或pointerTOCBSFAddCallBack:注册事件名和指向回调函数,回调对象的指针CallCallBack:在回调表中,检索注册在指定事件上回调函数并调用它们事件发生时,调用CallCallBack函数对事件event进行处理的成员函数从CallBack类继承的回调表callBackList,成员函数AddCallBack和C。
10、allCallBack。当回调函数为静态成员函数或普通C函数时,pointerToCBO为NULL。事件名是回调表callBackLis中的检索关键字。回调对象中其它成员函数CallBack类的成员函数AddCallBack用来将回调函数注册到事件对象的回调表中。它有两个重载版本voidCallBack::AddCallBack(char*event,CallBackFunctioncbf,CallBack*p);voidCallBack::AddCallBack(char*event,CallBackStaticFunctioncbsf);其中,第一个AddCallBack用来将某回调对象的成员函数注册到事件对象的回调表中。第二个AddCallBack用来将或某回调类的静态成员函数注册到事件对象的回调表中。在上参数表中,event是指向事件名字符串的指针,p是指向回调对象的指针,cbf和cbsf分别是指向成员函数及静态成员函数(或普通函数)的指针。当回调函数来自某回调对象SomeObject时,传递成员函数指针应采用如下格式:(CallBackFunction)&SomeObject。
本文标题:CALLBACK
链接地址:https://www.777doc.com/doc-3264809 .html