MFC导出DLL回调函数注册与调用全流程
在MFC开发中,回调机制是DLL主动通知宿主程序的常用方式。本指南演示如何通过函数指针传递和GetProcAddress动态加载,实现DLL内部定时器结束后自动触发外部处理函数的完整流程。
DLL端:定义与注册回调
要在DLL中实现回调,首先需要定义一个函数指针类型,并导出一个用于接收该指针的注册函数。这相当于提供一个“插座”,让宿主程序插入具体的“插头”(回调函数)。
第1步:定义回调类型与注册接口
目的:声明回调函数的签名,并提供一个导出的API供外部传入函数指针。
在DLL的 .h 文件中:
// 定义回调函数类型,参数为字符串描述信息
typedef void (*TimerTriggerDescrip)(std::string sDescrip);
// 导出注册函数,允许外部传入具体的回调函数指针
_InterrExport void CallBackFunc_GetTimerTriggerDescrip(TimerTriggerDescrip callback);
第2步:内部存储指针
目的:将外部传入的函数指针保存为全局或类成员变量,以便后续调用。
在DLL的 .cpp 文件中,声明一个私有指针变量:
TimerTriggerDescrip pFuncTimerDescrip = nullptr;
第3步:实现注册功能
目的:接收外部传入的指针并赋值给内部变量。
_InterrExport void CallBackFunc_GetTimerTriggerDescrip(TimerTriggerDescrip callback)
{
pFuncTimerDescrip = callback;
}
DLL端:触发回调执行
当业务逻辑到达特定时机(如定时结束、事件发生),即可调用存储的函数指针。
第4步:编写触发逻辑
下面以模拟延时后触发为例。在实际项目中,Sleep仅用于演示,实际场景通常为线程同步、网络请求完成或硬件中断。
_InterrExport void BeginTimerStart(int nTime)
{
Sleep(nTime); // 模拟耗时操作
// 检查指针是否已注册,防止空指针异常
if (pFuncTimerDescrip != nullptr)
{
pFuncTimerDescrip("接收到了定时器触发结束消息~");
}
}
宿主端:加载DLL并绑定回调
宿主程序需要动态加载DLL,获取导出函数的地址,并定义自己的回调函数来处理DLL发来的消息。
第5步:声明函数指针类型及句柄
目的:确保宿主程序能识别DLL的函数签名。
// 必须与DLL中定义的签名完全一致
typedef void(*TimerTriggerDescrip)(std::string sDescrip);
// 对应DLL中的注册函数签名
typedef void (*CallBackFunc_GetTimerTriggerDescrip)(TimerTriggerDescrip);
HINSTANCE handle; // DLL模块句柄
CallBackFunc_GetTimerTriggerDescrip pCallFuncTimerDescrip; // 注册函数地址
第6步:加载DLL并获取接口
入口:LoadLibrary。动作:加载DLL并使用 GetProcAddress 获取 CallBackFunc_GetTimerTriggerDescrip 的地址。
handle = LoadLibrary(_T("YourDll.dll"));
pCallFuncTimerDescrip = (CallBackFunc_GetTimerTriggerDescrip)GetProcAddress(handle, "CallBackFunc_GetTimerTriggerDescrip");
第7步:定义并注册回调函数
目的:实现具体的业务逻辑,并将其注册给DLL。
// 宿主的回调实现
void CallBack_ReceiveTimerDescrip(std::string sDescrip)
{
OutputDebugStringA(sDescrip.c_str());
// 此处可添加UI更新或其他业务处理
}
// 执行注册
if (pCallFuncTimerDescrip)
{
pCallFuncTimerDescrip(CallBack_ReceiveTimerDescrip);
}
调用触发流程
注册完成后,调用DLL的导出函数即可触发回调。
// 找到并调用触发函数
HMODULE hMod = GetModuleHandle(_T("YourDll.dll"));
typedef void (*BeginTimer)(int);
BeginTimer beginTimer = (BeginTimer)GetProcAddress(hMod, "BeginTimerStart");
if (beginTimer)
{
beginTimer(1000); // 延时1秒后,DLL将自动调用上面的 Callback_ReceiveTimerDescrip
}
以上就是MFC导出DLL回调函数方法的详细内容,更多关于MFC DLL开发的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













