首頁 > 軟體

C語言MFC匯出dll回撥函數方法詳解

2022-11-17 14:00:22

如何將回撥函數匯出來

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

回撥函數的應用相信很多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回撥函數的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com