MFC导出DLL回调函数注册与调用全流程

Noah
Noah
发布时间:2026-10-15| 4人浏览过
原创

在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开发的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。