網(wǎng)站首頁 編程語言 正文
如何將回調(diào)函數(shù)導出來
這一章節(jié)主要講述在導出函數(shù)的基礎(chǔ)上如何將回調(diào)函數(shù)導出來。
回調(diào)函數(shù)的應用相信很多C++程序猿兒們都不陌生吧,在某些場景下可謂是神助攻!那么,今天就來為大家講解下,在導出dll中如何使用回調(diào)函數(shù)。
對于導出dll使用回調(diào)函數(shù),大家不必懼怕,可以當成是回調(diào)類中主動調(diào)用方法,并在使用dll的開發(fā)程序中被觸發(fā)。
下面,我就為大家詳細講解如何導出回調(diào)函數(shù)吧~
舉一個簡單的例子,sleep一定時間后通知應用程序函數(shù)。
操作流程,如下所示:
在實際開發(fā)中肯定不會在dll中將sleep作為回調(diào)函數(shù)處理,那真是吃飽了撐了,這里,只是用于簡單例子說明,重點是想突出,如何讓dll主動調(diào)用應用程序。
dll內(nèi)部回調(diào)函數(shù)功能講解
1:定義開始定時操作函數(shù)
該函數(shù)由調(diào)用dll的程序主動調(diào)用,告訴dll需要開始進行定時操作了。
對于這個函數(shù),沒什么過多說明,上一章節(jié)講述了如何使用回調(diào)函數(shù)了,直接上代碼:
.h中聲明
//開始計算定時觸發(fā) _InterrExport void BeginTimerStart(int nTime);//開始計算定時觸發(fā)時間
.cpp中實現(xiàn)
_InterrExport void BeginTimerStart(int nTime) { Sleep(nTime); pFuncTimerDescrip("接收到了定時器觸發(fā)結(jié)束消息~"); }
首先,根據(jù)參數(shù)進行sleep對應的秒數(shù),時間到達后,由dll主動回調(diào)開發(fā)程序,其中pFuncTimerDescrip函數(shù)就是主動觸發(fā)的。
對于pFuncTimerDescrip函數(shù)該如何操作呢?
2:回調(diào)函數(shù)
普通的回調(diào)方式不在過多說明,直接講解在dll中的回調(diào)使用。
在例子中,回調(diào)函數(shù)是一個類似于TimerTriggerDescrip(std::string sDescrip);
這樣的函數(shù)結(jié)構(gòu)。
參數(shù)只有一個,并且是字符串類型。
2.1:定義回調(diào)函數(shù)接口
普通的dll導出函數(shù)中,參數(shù)是一個明確類型的值,比如:int類型、float類型、甚至是一個結(jié)構(gòu)體。
而作為回調(diào)函數(shù)來說,必不可少的就是注冊回調(diào)函數(shù),dll中的回調(diào)函數(shù)也是如此。
首先,定義回調(diào)函數(shù)
typedef void (*TimerTriggerDescrip)(std::string sDescrip); //回調(diào)函數(shù),定時觸發(fā)
其次,注冊回調(diào)函數(shù)
_InterrExport void CallBackFunc_GetTimerTriggerDescrip(TimerTriggerDescrip callback);
對外部調(diào)用者來說,開放的僅僅是注冊回調(diào)函數(shù)而已。
以上2.1中的所有代碼,都在.h中聲明。
2.2:dll中使用回調(diào)函數(shù)觸發(fā)消息
這里所說的觸發(fā),也就是上述代碼:
pFuncTimerDescrip("接收到了定時器觸發(fā)結(jié)束消息~");
其中,pFuncTimerDescrip就是回調(diào)函數(shù)的指針。
在.cpp應用中設(shè)置
TimerTriggerDescrip pFuncTimerDescrip= nullptr;
到這里,在dll中設(shè)置回調(diào)函數(shù)就完成了,那么接下來,該實現(xiàn)如何在應用程序中調(diào)用dll中的回調(diào)函數(shù)了。
應用程序調(diào)用dll回調(diào)函數(shù)
1:加載dll庫
在使用之前一定要記得加載dll,上一章節(jié)有詳細介紹,這里就不說明了。
2:聲明回調(diào)函數(shù)
在調(diào)用dll的地方需要將回掉函數(shù)的函數(shù)進行聲明,與普通的dll導出函數(shù)方式一致,代碼如下:
typedef void(*TimerTriggerDescrip)(std::string sDescrip); typedef void (*CallBackFunc_GetTimerTriggerDescrip)(TimerTriggerDescrip); CallBackFunc_GetTimerTriggerDescrip pCallFuncTimerDescrip;
TimerTriggerDescrip:該函數(shù)是dll庫中,內(nèi)部觸發(fā)應用程序的函數(shù),這里作為回調(diào)函數(shù)的參數(shù)也是需要聲明的。
3:注冊回調(diào)函數(shù)
在注冊時,與普通的dll函數(shù)略有不同
//注冊:回調(diào)函數(shù) pCallFuncTimerDescrip = (CallBackFunc_GetTimerTriggerDescrip)GetProcAddress(handle, "CallBackFunc_GetTimerTriggerDescrip"); pCallFuncTimerDescrip(CallBack_ReceiveTimerDescrip);
CallBack_ReceiveTimerDescrip:該函數(shù)就是對應dll庫中TimerTriggerDescrip函數(shù)。
//接收:dll回調(diào)函數(shù) void CallBack_ReceiveTimerDescrip(std::string sDescrip) { OutputDebugStringA(sDescrip.c_str()); }
參數(shù)與dll中的回調(diào)函數(shù)保持一致,就可以接收到回調(diào)的信息了。
原文鏈接:https://juejin.cn/post/7166024849125539847
相關(guān)推薦
- 2022-09-17 C++中cin的返回值問題_C 語言
- 2022-08-27 C#8.0中的模式匹配_C#教程
- 2022-05-11 解決 IntelliJ IDEA 中 .propertise 文件保存后中文亂碼
- 2022-06-10 使用Android實現(xiàn)一個懸浮在軟鍵盤上的輸入欄_Android
- 2022-10-17 QT?TCP實現(xiàn)簡單的通信示例_C 語言
- 2022-07-10 同時啟動兩個項目,產(chǎn)生的跨域問題
- 2022-06-16 React中前端路由的示例代碼_React
- 2022-08-15 創(chuàng)建型設(shè)計模式之建造者模式
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支