C語言MFC導出dll回調函數方法詳解

如何將回調函數導出來

這一章節主要講述在導出函數的基礎上如何將回調函數導出來。

回調函數的應用相信很多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中的回調函數保持一致,就可以接收到回調的信息瞭。

以上就是C語言MFC導出dll回調函數方法詳解的詳細內容,更多關於C語言MFC導出dll回調函數的資料請關註WalkonNet其它相關文章!

推薦閱讀: