热点推荐

查看: 748|回复: 24
收起左侧

[资料] C++如何使用回调函数?

[复制链接]
  • TA的每日心情
    奋斗
    昨天 13:12
  • 签到天数: 428 天

    连续签到: 73 天

    [LV.9]以坛为家II

    358

    主题

    1262

    帖子

    9577

    积分

    Rank: 9

    积分
    9577

    突出贡献优秀版主荣誉管理论坛元老优质会员最佳新人

    发表于 2018-1-23 19:25:34 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
          回调函数就是通过把自己的方法注册给别人,然后别人需要返回数据的时候通过你之前注册的函数将参数给你返回来。意思很简单,那么接下来,我们就用最近一个朋友的案例来解释下这个函数的原理。

    环境先说明下:用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++开发的代码,有兴趣学习的可以自己下载看看!
    游客,如果您要查看本帖隐藏内容请回复


    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
  • TA的每日心情
    奋斗
    2017-11-30 10:06
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    0

    主题

    6

    帖子

    139

    积分

    Rank: 1

    积分
    139
    发表于 2018-1-24 10:23:59 | 显示全部楼层
    学习学习

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情

    昨天 08:41
  • 签到天数: 314 天

    连续签到: 3 天

    [LV.8]以坛为家I

    27

    主题

    174

    帖子

    5051

    积分

    Rank: 7Rank: 7Rank: 7

    积分
    5051

    活跃会员优质会员

    发表于 2018-1-24 10:27:42 | 显示全部楼层
    好东西,分享一下

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    2018-3-26 09:14
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    2

    主题

    34

    帖子

    471

    积分

    Rank: 2Rank: 2

    积分
    471
    发表于 2018-1-25 08:32:17 | 显示全部楼层

    学习学习

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    2018-10-19 08:56
  • 签到天数: 27 天

    连续签到: 2 天

    [LV.4]偶尔看看III

    0

    主题

    28

    帖子

    541

    积分

    Rank: 3

    积分
    541

    活跃会员

    发表于 2018-2-1 15:30:42 | 显示全部楼层


    好东西,分享一下

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

    该用户从未签到

    0

    主题

    3

    帖子

    105

    积分

    Rank: 1

    积分
    105

    优质会员

    发表于 2018-2-10 18:43:46 | 显示全部楼层
    下载学习一下,谢谢楼主!

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    擦汗
    2018-3-26 15:34
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    0

    主题

    9

    帖子

    2215

    积分

    Rank: 5Rank: 5Rank: 5

    积分
    2215
    发表于 2018-2-12 17:00:47 | 显示全部楼层
    MARK,学习学习

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

    该用户从未签到

    0

    主题

    8

    帖子

    106

    积分

    Rank: 1

    积分
    106

    优质会员

    发表于 2018-2-22 11:54:38 | 显示全部楼层
    学习学习

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    2017-12-1 08:25
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    15

    帖子

    138

    积分

    Rank: 1

    积分
    138

    优质会员

    发表于 2018-2-24 12:53:19 | 显示全部楼层
    C++如何使用回调函数 eeeeeeeeeeeeeeeeeee

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

    如何回报帮助你解决问题的坛友,可以以【悬赏】的方式提问,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识

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