能详细解释一下到底什么是回调(callback)函数吗?谢谢了!!
解决方案 »
- 如何判断光驱内光盘的种类(CD-ROM,CD-R,CD-RW,DVD-RW,DVD-R,DVD-ROM)
- 为什么剪贴板只有一个字符?
- spy++中出现很多省略号
- 怎样从资源ID取得资源文件的路径
- 如何判断CIPAddressCtrl中每个field的值 是否为空
- vector<string>().swap(str) 这个真能释放内存吗,我怎么感觉没效果啊!
- 跪求论坛大牛帮忙 用vc2010打开二进制的txt文件
- 怎么样才能处理像VB中的TREEVIEW中的NODECLICK的事件?
- 谁能给个自定义消息的例子我?
- New Question to XT2(),
- 问题:递归求组合数
- 我的VC怎么不提示“类的成员”和“函数声明”呢????????!!!!!!!!!!!!!!!
举个例子:SetTimer(),一种处理是,你响应WM_TIMER消息,这暂且不讨论;还有一种用法,就是你提供一个函数,让系统在产生timer消息时自动调用,这种情况下,你可以写好一个timer消息的处理函数,把函数的地址作为SetTimer()的参数,而你这个timer消息的处理函数,就是回调函数。
#define CALLBACK _stdcall
至于_stdcall是“函数参数由右到左顺序压入椎栈,函数返回时椎栈的回收由
函数本身来完成"的函数调用约定
#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");
}
在《深入浅出MFC 2e》中有较详细的介绍!
关键点是调用时压栈与pascal不同。
callback调用前的压栈保存动作是调用者完成的,如果自己去调用必须知道要对哪些寄存器进行保护,然后压入栈。