能详细解释一下到底什么是回调(callback)函数吗?谢谢了!!

解决方案 »

  1.   

    callback函数就是自己写的函数,但自己并没有调用,而是由系统调用
      

  2.   

    Callback函数是你提供给系统调用的函数。很多情况下,系统某个情况下,定义需要执行某个操作,而操作本身由有用户的程序来提供,这时,就要用到回调函数了。所以,简单地说。回调函数,就是你写一个函数,在系统定义的地点提供给系统调用。
    举个例子:SetTimer(),一种处理是,你响应WM_TIMER消息,这暂且不讨论;还有一种用法,就是你提供一个函数,让系统在产生timer消息时自动调用,这种情况下,你可以写好一个timer消息的处理函数,把函数的地址作为SetTimer()的参数,而你这个timer消息的处理函数,就是回调函数。
      

  3.   

    CallBack 函数是你自己写的函数,但自己不直接调用的函数!@\是系统调用的函数!是系统与用户的接口!ok!
      

  4.   

    补充:
    #define CALLBACK _stdcall
    至于_stdcall是“函数参数由右到左顺序压入椎栈,函数返回时椎栈的回收由
    函数本身来完成"的函数调用约定
      

  5.   

    其实callback并不仅限于系统调用,用户根据需要,可以建立自己的Callback机制。比如网络通讯,当接收线程(可能专门有一个类封装网络接收行为)收到数据包,需要通知上层(可能又有一个类封装上层数据处理).那么我认为Callback最本质的特征包括两点:注册和触发。实现可以是各种各样的形式,但机制都是如此。比如对于两个类而言,给出以下示例代码:
    #include <iostream.h>class B 
    {
    public:
    B();
    void OnGetMsg(unsigned long ID,const char *  MsgName);private:
    unsigned long   m_ID;
    };B::B()
    {
    m_ID = 1002;
    }void B::OnGetMsg(unsigned long ID, const char *MsgName)
    {
    cout << "srcObjID = " << ID << ", " << "tgtObjID = " << m_ID <<", " <<"Message: " << MsgName << endl;
    }class A 
    {
    public:
    A();
    void RegisterMsg(B* pb);
    void SendMsg(char* msg);private:
    B * m_pb;
    unsigned long m_ID;
    };A::A()
    {
    m_ID = 1001;
    m_pb = NULL;
    }
    void A::RegisterMsg(B* pb)
    {
    m_pb  = pb;
    }void A::SendMsg(char *msg)
    {
    if(m_pb != NULL)
    m_pb->OnGetMsg(m_ID,msg);
    }
    void main()
    {   //产生回调的类对象a
       A a;   //相应回调的类对象b
       B b;  //A类对象注册
      a.RegisterMsg(&b);  //A类对象触发、B类对象响应
      a.SendMsg("i'm callback function");
    }
      

  6.   

    你写的,但是是系统调用的就是callback函数
      

  7.   

    其实写法非常灵活,可以在同一个类中实现成员函数之间的回调(需要静态成员函数实现),也可以不必在类中实现,这两种情况都需要注册函数的参数为函数地址。关于回调的实现机制,可以参考IEEE的Callback implementation in C++
      

  8.   

    另外澄清一点,CALLBACK不过就是_stdcall关键字而已,并不是表示我写了CALLBACK就会被调用的。呵呵!
      

  9.   

    Callback函数有点类似虚函数,不仅仅系统调用,而且你自己也可以定义Callback函数,比如在自己的类中定义Callback函数的原型,然后在类的其他成员函数中就可以直接调用该Callback函数,而不用管他的具体实现,当然你可以传入参数。而具体实现可能在其他应用程序中或者Dll中,这样可以把接口和实现分离。
      

  10.   

    Callback函数是由系统来调用的!
    在《深入浅出MFC 2e》中有较详细的介绍!
      

  11.   

    callback是一种函数调用习惯,大家都这么说。
    关键点是调用时压栈与pascal不同。
    callback调用前的压栈保存动作是调用者完成的,如果自己去调用必须知道要对哪些寄存器进行保护,然后压入栈。