C語言MFC導(dǎo)出dll回調(diào)函數(shù)方法詳解
如何將回調(diào)函數(shù)導(dǎo)出來
這一章節(jié)主要講述在導(dǎo)出函數(shù)的基礎(chǔ)上如何將回調(diào)函數(shù)導(dǎo)出來。
回調(diào)函數(shù)的應(yīng)用相信很多C++程序猿兒們都不陌生吧,在某些場(chǎng)景下可謂是神助攻!那么,今天就來為大家講解下,在導(dǎo)出dll中如何使用回調(diào)函數(shù)。
對(duì)于導(dǎo)出dll使用回調(diào)函數(shù),大家不必懼怕,可以當(dāng)成是回調(diào)類中主動(dòng)調(diào)用方法,并在使用dll的開發(fā)程序中被觸發(fā)。
下面,我就為大家詳細(xì)講解如何導(dǎo)出回調(diào)函數(shù)吧~
舉一個(gè)簡單的例子,sleep一定時(shí)間后通知應(yīng)用程序函數(shù)。
操作流程,如下所示:
在實(shí)際開發(fā)中肯定不會(huì)在dll中將sleep作為回調(diào)函數(shù)處理,那真是吃飽了撐了,這里,只是用于簡單例子說明,重點(diǎn)是想突出,如何讓dll主動(dòng)調(diào)用應(yīng)用程序。
dll內(nèi)部回調(diào)函數(shù)功能講解
1:定義開始定時(shí)操作函數(shù)
該函數(shù)由調(diào)用dll的程序主動(dòng)調(diào)用,告訴dll需要開始進(jìn)行定時(shí)操作了。
對(duì)于這個(gè)函數(shù),沒什么過多說明,上一章節(jié)講述了如何使用回調(diào)函數(shù)了,直接上代碼:
.h中聲明
//開始計(jì)算定時(shí)觸發(fā) _InterrExport void BeginTimerStart(int nTime);//開始計(jì)算定時(shí)觸發(fā)時(shí)間
.cpp中實(shí)現(xiàn)
_InterrExport void BeginTimerStart(int nTime) { Sleep(nTime); pFuncTimerDescrip("接收到了定時(shí)器觸發(fā)結(jié)束消息~"); }
首先,根據(jù)參數(shù)進(jìn)行sleep對(duì)應(yīng)的秒數(shù),時(shí)間到達(dá)后,由dll主動(dòng)回調(diào)開發(fā)程序,其中pFuncTimerDescrip函數(shù)就是主動(dòng)觸發(fā)的。
對(duì)于pFuncTimerDescrip函數(shù)該如何操作呢?
2:回調(diào)函數(shù)
普通的回調(diào)方式不在過多說明,直接講解在dll中的回調(diào)使用。
在例子中,回調(diào)函數(shù)是一個(gè)類似于TimerTriggerDescrip(std::string sDescrip);
這樣的函數(shù)結(jié)構(gòu)。
參數(shù)只有一個(gè),并且是字符串類型。
2.1:定義回調(diào)函數(shù)接口
普通的dll導(dǎo)出函數(shù)中,參數(shù)是一個(gè)明確類型的值,比如:int類型、float類型、甚至是一個(gè)結(jié)構(gòu)體。
而作為回調(diào)函數(shù)來說,必不可少的就是注冊(cè)回調(diào)函數(shù),dll中的回調(diào)函數(shù)也是如此。
首先,定義回調(diào)函數(shù)
typedef void (*TimerTriggerDescrip)(std::string sDescrip); //回調(diào)函數(shù),定時(shí)觸發(fā)
其次,注冊(cè)回調(diào)函數(shù)
_InterrExport void CallBackFunc_GetTimerTriggerDescrip(TimerTriggerDescrip callback);
對(duì)外部調(diào)用者來說,開放的僅僅是注冊(cè)回調(diào)函數(shù)而已。
以上2.1中的所有代碼,都在.h中聲明。
2.2:dll中使用回調(diào)函數(shù)觸發(fā)消息
這里所說的觸發(fā),也就是上述代碼:
pFuncTimerDescrip("接收到了定時(shí)器觸發(fā)結(jié)束消息~");
其中,pFuncTimerDescrip就是回調(diào)函數(shù)的指針。
在.cpp應(yīng)用中設(shè)置
TimerTriggerDescrip pFuncTimerDescrip= nullptr;
到這里,在dll中設(shè)置回調(diào)函數(shù)就完成了,那么接下來,該實(shí)現(xiàn)如何在應(yīng)用程序中調(diào)用dll中的回調(diào)函數(shù)了。
應(yīng)用程序調(diào)用dll回調(diào)函數(shù)
1:加載dll庫
在使用之前一定要記得加載dll,上一章節(jié)有詳細(xì)介紹,這里就不說明了。
2:聲明回調(diào)函數(shù)
在調(diào)用dll的地方需要將回掉函數(shù)的函數(shù)進(jìn)行聲明,與普通的dll導(dǎo)出函數(shù)方式一致,代碼如下:
typedef void(*TimerTriggerDescrip)(std::string sDescrip); typedef void (*CallBackFunc_GetTimerTriggerDescrip)(TimerTriggerDescrip); CallBackFunc_GetTimerTriggerDescrip pCallFuncTimerDescrip;
TimerTriggerDescrip:該函數(shù)是dll庫中,內(nèi)部觸發(fā)應(yīng)用程序的函數(shù),這里作為回調(diào)函數(shù)的參數(shù)也是需要聲明的。
3:注冊(cè)回調(diào)函數(shù)
在注冊(cè)時(shí),與普通的dll函數(shù)略有不同
//注冊(cè):回調(diào)函數(shù) pCallFuncTimerDescrip = (CallBackFunc_GetTimerTriggerDescrip)GetProcAddress(handle, "CallBackFunc_GetTimerTriggerDescrip"); pCallFuncTimerDescrip(CallBack_ReceiveTimerDescrip);
CallBack_ReceiveTimerDescrip:該函數(shù)就是對(duì)應(yīng)dll庫中TimerTriggerDescrip函數(shù)。
//接收:dll回調(diào)函數(shù) void CallBack_ReceiveTimerDescrip(std::string sDescrip) { OutputDebugStringA(sDescrip.c_str()); }
參數(shù)與dll中的回調(diào)函數(shù)保持一致,就可以接收到回調(diào)的信息了。
以上就是C語言MFC導(dǎo)出dll回調(diào)函數(shù)方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言MFC導(dǎo)出dll回調(diào)函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Matlab實(shí)現(xiàn)好看的配對(duì)箱線圖的繪制
配對(duì)箱線圖,常見于配對(duì)樣本的數(shù)據(jù)分析中,它除了能夠表現(xiàn)兩組的整體差異,還能夠清晰地呈現(xiàn)單個(gè)樣本的前后改變。本文將用Matlab實(shí)現(xiàn)配對(duì)箱線圖的繪制,需要的可以參考一下2022-08-08C語言分別實(shí)現(xiàn)棧和隊(duì)列詳解流程
棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-04-04C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03