Dll中的回调函数

在C++中,回调函数是一种常用的编程技术,用于在某个事件发生时通知主程序。

Demo:DLL会从某个来源接收数据,并在处理完毕后通过回调函数通知主程序。

1. 定义回调函数原型
   在DLL的头文件中,你需要定义一个回调函数的原型。这将允许主程序提供一个符合该原型的函数,以便DLL在适当的时候调用。


   // 头文件(例如:DllCallback.h)
   #ifndef DLLCALLBACK_H
   #define DLLCALLBACK_H

   #ifdef __cplusplus
   extern "C" {
   #endif

   // 定义回调函数类型
   typedef void (*CallbackFunction)(int a, int b);

   // 声明DLL提供的函数,用于注册回调函数
   extern "C"_declspec(dllexport) void SetCallbackFunction(CallbackFunction cb);

   #ifdef __cplusplus
   }
   #endif

   #endif // DLLCALLBACK_H

2. 在DLL中实现回调注册和调用
   在DLL的实现文件中,你将需要提供一个函数,用于注册主程序提供的回调函数。同时,当DLL从其他地方接收并处理完数据后,可以调用这个回调函数。   

// 实现文件(例如:DllCallback.cpp)
   #include "DllCallback.h"

   // 保存回调函数指针的全局变量
   static CallbackFunction g_callbackFunction = nullptr;

   // 注册回调函数的函数实现
   void SetCallbackFunction(CallbackFunction cb) 
   {
       g_callbackFunction = cb;
   }


   // 当DLL处理完数据后,调用回调函数
   void OnDataProcessed(int a, int b) 
   {
       if (nullptr != g_callbackFunction) 
       {
           g_callbackFunction(a, b); // 调用主程序提供的回调函数
       }
   }

   // 其他DLL功能,例如接收数据的逻辑
   void SomeFunctionThatReceivesData() {
       // 接收数据...
       // 处理数据...

       // 数据处理完毕,调用回调函数通知主程序
       int resultA = ...;
       int resultB = ...;
       OnDataProcessed(resultA, resultB);
   }

3. 在主程序中实现并注册回调函数
   在主程序中,你需要定义一个与DLL中定义的回调函数原型相匹配的函数,并将其注册到DLL。 

 // 主程序
   #include "DllCallback.h"

   // 实现回调函数
   void MyCallbackFunction(int a, int b) {
       // 处理DLL传来的数据
       // ...
   }

   int main() {
       // 加载DLL
       // ...

       // 注册回调函数
       SetCallbackFunction(MyCallbackFunction);

       // 进行其他操作,等待DLL通过回调函数通知
       // ...

       return 0;
   }

通过上述步骤,你可以实现一个机制,让DLL在从其他地方接收数据并处理后,通过注册的回调函数来通知主程序。这样做的好处是,主程序不需要不断地检查DLL的状态,而是可以继续执行其他任务,只在需要时处理回调。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值