在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的状态,而是可以继续执行其他任务,只在需要时处理回调。