开启左侧

C++如何使用回调函数?

  [复制链接]
Criss 发表于 2018-1-23 19:25:34 | 显示全部楼层 |阅读模式
      回调函数就是通过把自己的方法注册给别人,然后别人需要返回数据的时候通过你之前注册的函数将参数给你返回来。意思很简单,那么接下来,我们就用最近一个朋友的案例来解释下这个函数的原理。

环境先说明下:用win32写一个dll然后用主程序去调用。

dll中声明部分*.h文件:

  1. #ifndef MDLL_API
  2. #define MDLL_API        extern "C" __declspec(dllimport)
  3. #else
  4. #define MDLL_API    extern "C" __declspec(dllexport)
  5. #endif

  6. typedef void (*ShowMessage)(char* chText);
  7. MDLL_API void  RegisterShow(ShowMessage pMsg);
  8. MDLL_API void  CallMsg(char* chText);
复制代码


实现部分*.cpp:
  1. #include "stdafx.h"
  2. #define MDLL_API
  3. #include "mdll.h"

  4. ShowMessage showMsg;
  5. MDLL_API void  RegisterShow(ShowMessage pMsg)
  6. {
  7.         if(pMsg!=nullptr)
  8.         {
  9.                 showMsg = pMsg;
  10.         }
  11. }

  12. MDLL_API void  CallMsg(char* chText)
  13. {
  14.         if(showMsg!=nullptr)
  15.         {
  16.                 showMsg(chText);
  17.         }
  18. }
复制代码


上面就两个函数,通过RegisterShow将方法注册给dll,然后在主程序人为调用,引发参数被回调回来。

主程序中main函数我们这样写
  1. #include "..\\mdll\\mdll.h"
  2. #pragma comment(lib, "..\\debug\\mdll.lib")


  3. void DispMessage(char* chText)  
  4. {  
  5.         int num = MultiByteToWideChar(0,0,chText,-1,NULL,0);
  6.         wchar_t *wide = new wchar_t[num];
  7.         MultiByteToWideChar(0,0,chText,-1,wide,num);
  8.         ::MessageBox(0,wide,0,0);
  9. }  

  10. int main(int argc, char* argv[])  
  11. {  
  12.         //注册回调函数
  13.         ShowMessage showMsg;
  14.         showMsg = DispMessage;
  15.         RegisterShow(showMsg);
  16.         
  17.         //人为触发回调
  18.         CallMsg("Hello,World!");

  19.         system("pause");
  20.         return 0;  
  21. }
复制代码


其中,DispMessage函数我们并没有直接去调用,而且在上面showMsg = DispMessage; 把地址给了回调的类型,在dll中引发该函数。

附件是vs2010 c++开发的代码,有兴趣学习的可以自己下载看看!
游客,如果您要查看本帖隐藏内容请回复


夜行人 发表于 2018-1-24 10:27:42 | 显示全部楼层
好东西,分享一下
avtiger 发表于 2018-2-10 18:43:46 | 显示全部楼层
下载学习一下,谢谢楼主!
feizxz 发表于 2018-2-24 12:53:19 | 显示全部楼层
C++如何使用回调函数 eeeeeeeeeeeeeeeeeee
halco 发表于 2018-3-19 10:13:47 | 显示全部楼层
谢谢 好东西值得下载
www8690 发表于 2018-4-15 15:52:12 | 显示全部楼层
学习下
armyzhang 发表于 2018-4-19 16:09:21 | 显示全部楼层
不错,学习学习,真是好人,好人,让我对回调机制彻底弄清除了
jun198923 发表于 2018-9-1 01:26:10 | 显示全部楼层
很有兴趣,这确实对编程有很大帮助
chengsheng_jia 发表于 2018-10-15 09:29:14 | 显示全部楼层
这个回调函数值得好好学习一下
haijun187 发表于 2018-11-10 09:19:27 | 显示全部楼层
kkkkk
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表