C语言MFC导出dll回调函数方法详解
中国好公民st 人气:0如何将回调函数导出来
这一章节主要讲述在导出函数的基础上如何将回调函数导出来。
回调函数的应用相信很多C++程序猿儿们都不陌生吧,在某些场景下可谓是神助攻!那么,今天就来为大家讲解下,在导出dll中如何使用回调函数。
对于导出dll使用回调函数,大家不必惧怕,可以当成是回调类中主动调用方法,并在使用dll的开发程序中被触发。
下面,我就为大家详细讲解如何导出回调函数吧~
举一个简单的例子,sleep一定时间后通知应用程序函数。
操作流程,如下所示:
在实际开发中肯定不会在dll中将sleep作为回调函数处理,那真是吃饱了撑了,这里,只是用于简单例子说明,重点是想突出,如何让dll主动调用应用程序。
dll内部回调函数功能讲解
1:定义开始定时操作函数
该函数由调用dll的程序主动调用,告诉dll需要开始进行定时操作了。
对于这个函数,没什么过多说明,上一章节讲述了如何使用回调函数了,直接上代码:
.h中声明
//开始计算定时触发 _InterrExport void BeginTimerStart(int nTime);//开始计算定时触发时间
.cpp中实现
_InterrExport void BeginTimerStart(int nTime) { Sleep(nTime); pFuncTimerDescrip("接收到了定时器触发结束消息~"); }
首先,根据参数进行sleep对应的秒数,时间到达后,由dll主动回调开发程序,其中pFuncTimerDescrip函数就是主动触发的。
对于pFuncTimerDescrip函数该如何操作呢?
2:回调函数
普通的回调方式不在过多说明,直接讲解在dll中的回调使用。
在例子中,回调函数是一个类似于TimerTriggerDescrip(std::string sDescrip);
这样的函数结构。
参数只有一个,并且是字符串类型。
2.1:定义回调函数接口
普通的dll导出函数中,参数是一个明确类型的值,比如:int类型、float类型、甚至是一个结构体。
而作为回调函数来说,必不可少的就是注册回调函数,dll中的回调函数也是如此。
首先,定义回调函数
typedef void (*TimerTriggerDescrip)(std::string sDescrip); //回调函数,定时触发
其次,注册回调函数
_InterrExport void CallBackFunc_GetTimerTriggerDescrip(TimerTriggerDescrip callback);
对外部调用者来说,开放的仅仅是注册回调函数而已。
以上2.1中的所有代码,都在.h中声明。
2.2:dll中使用回调函数触发消息
这里所说的触发,也就是上述代码:
pFuncTimerDescrip("接收到了定时器触发结束消息~");
其中,pFuncTimerDescrip就是回调函数的指针。
在.cpp应用中设置
TimerTriggerDescrip pFuncTimerDescrip= nullptr;
到这里,在dll中设置回调函数就完成了,那么接下来,该实现如何在应用程序中调用dll中的回调函数了。
应用程序调用dll回调函数
1:加载dll库
在使用之前一定要记得加载dll,上一章节有详细介绍,这里就不说明了。
2:声明回调函数
在调用dll的地方需要将回掉函数的函数进行声明,与普通的dll导出函数方式一致,代码如下:
typedef void(*TimerTriggerDescrip)(std::string sDescrip); typedef void (*CallBackFunc_GetTimerTriggerDescrip)(TimerTriggerDescrip); CallBackFunc_GetTimerTriggerDescrip pCallFuncTimerDescrip;
TimerTriggerDescrip:该函数是dll库中,内部触发应用程序的函数,这里作为回调函数的参数也是需要声明的。
3:注册回调函数
在注册时,与普通的dll函数略有不同
//注册:回调函数 pCallFuncTimerDescrip = (CallBackFunc_GetTimerTriggerDescrip)GetProcAddress(handle, "CallBackFunc_GetTimerTriggerDescrip"); pCallFuncTimerDescrip(CallBack_ReceiveTimerDescrip);
CallBack_ReceiveTimerDescrip:该函数就是对应dll库中TimerTriggerDescrip函数。
//接收:dll回调函数 void CallBack_ReceiveTimerDescrip(std::string sDescrip) { OutputDebugStringA(sDescrip.c_str()); }
参数与dll中的回调函数保持一致,就可以接收到回调的信息了。
加载全部内容