回调函数就是通过把自己的方法注册给别人,然后别人需要返回数据的时候通过你之前注册的函数将参数给你返回来。意思很简单,那么接下来,我们就用最近一个朋友的案例来解释下这个函数的原理。
环境先说明下:用win32写一个dll然后用主程序去调用。
dll中声明部分*.h文件:
- #ifndef MDLL_API
- #define MDLL_API extern "C" __declspec(dllimport)
- #else
- #define MDLL_API extern "C" __declspec(dllexport)
- #endif
- typedef void (*ShowMessage)(char* chText);
- MDLL_API void RegisterShow(ShowMessage pMsg);
- MDLL_API void CallMsg(char* chText);
复制代码
实现部分*.cpp:
- #include "stdafx.h"
- #define MDLL_API
- #include "mdll.h"
- ShowMessage showMsg;
- MDLL_API void RegisterShow(ShowMessage pMsg)
- {
- if(pMsg!=nullptr)
- {
- showMsg = pMsg;
- }
- }
- MDLL_API void CallMsg(char* chText)
- {
- if(showMsg!=nullptr)
- {
- showMsg(chText);
- }
- }
复制代码
上面就两个函数,通过RegisterShow将方法注册给dll,然后在主程序人为调用,引发参数被回调回来。
主程序中main函数我们这样写
- #include "..\\mdll\\mdll.h"
- #pragma comment(lib, "..\\debug\\mdll.lib")
- void DispMessage(char* chText)
- {
- int num = MultiByteToWideChar(0,0,chText,-1,NULL,0);
- wchar_t *wide = new wchar_t[num];
- MultiByteToWideChar(0,0,chText,-1,wide,num);
- ::MessageBox(0,wide,0,0);
- }
- int main(int argc, char* argv[])
- {
- //注册回调函数
- ShowMessage showMsg;
- showMsg = DispMessage;
- RegisterShow(showMsg);
-
- //人为触发回调
- CallMsg("Hello,World!");
- system("pause");
- return 0;
- }
复制代码
其中,DispMessage函数我们并没有直接去调用,而且在上面showMsg = DispMessage; 把地址给了回调的类型,在dll中引发该函数。
附件是vs2010 c++开发的代码,有兴趣学习的可以自己下载看看!
|