您的位置:首页 > 其它

什么是回调函数(callback)(转)

2011-02-21 15:55 393 查看
http://www.yuanma.org/data/2006/0605/article_641.htm

我刚开始接触回调时, 也是一团雾水.很多人解释这个问题时, 总是拿API来举例子, 本来菜鸟最惧怕的就是API, ^_^. 回调跟API没有必然联系.

其实回调就是一种利用函数指针进行函数调用的过程.

为什么要用回调呢?比如我要写一个子模块给你用, 来接收远程socket发来的命令.当我接收到命令后, 需要调用你的主模块的函数, 来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令, 我也不知道你的主模块是什么.cpp或者.h, 或者说, 我根本不用关心你在主模块里怎么处理它, 也不应该关心用什么函数处理它...... 怎么办?

使用回调.

我在我的模块里先定义回调函数类型, 以及回调函数指针.
typedef void (CALLBACK *cbkSendCmdToMain) (AnsiString sCmd);
cbkSendCmdToMain SendCmdToMain;
这样SendCmdToMain就是一个指向拥有一个AnsiString形参, 返回值为void的函数指针.

这样, 在我接收到命令时, 就可以调用这个函数啦.
...
SendCmdToMain(sCommand);
...

但是这样还不够, 我得给一个接口函数(比如Init), 让你在主模块里调用Init来注册这个回调函数.

在你的主模块里, 可能这样

void CALLBACK YourSendCmdFun(AnsiString sCmd); //声明
...
void CALLBACK YourSendCmdFun(AnsiString sCmd); //定义
{
ShowMessage(sCmd);
}
...

调用Init函数向我的模块注册回调.可能这样:

Init(YourSendCmdFun, ...);

这样, 预期目的就达到了.

需要注意一点, 回调函数一般都要声明为全局的. 如果要在类里使用回调函数, 前面需要加上 static , 其实也相当于全局的.

EXAMPLE

声明:typedef void (CALLBACK *lpShowFileOpInfoCbk) (LPVOID lpVoid, const CString &strPathName);

参数:lpShowFileOpInfoCbk lpCallBack = NULL

定义:void CXXDlg::ShowFileOpInfoCbk(LPVOID lpVoid, const CString &strPathName)

    {

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: