如何在C++中将动态库调用代码封装为适配多对话框类的通用函数?
通用封装实现方案
使用C++函数模板即可完成封装,将可变的对话框返回类型作为模板参数,无需重复编写DLL加载、函数地址查找的重复逻辑。
封装后的通用代码
#include <windows.h> // 模板参数:要返回的对话框类类型 template<typename TDlg> TDlg* ShowDlgFromDll(LPCTSTR dllName, int callVal) { HINSTANCE hDll = LoadLibrary(dllName); if (NULL == hDll) { return NULL; } // 自动推导对应返回类型的函数指针,无需手动重复typedef typedef TDlg*(*DllFunType)(int); DllFunType pShowDlg = (DllFunType)GetProcAddress(hDll, "ShowDlg"); if (NULL == pShowDlg) { FreeLibrary(hDll); return NULL; } TDlg* pResultDlg = pShowDlg(callVal); // 注意:如果返回的是非模态对话框、需要长期持有DLL资源,不要在此处释放DLL,可将hDll通过出参返回给调用方自行管理生命周期 // FreeLibrary(hDll); return pResultDlg; }
调用示例
// 加载Test1.dll获取CTest1Dlg实例 CTest1Dlg* pTest1Dlg = ShowDlgFromDll<CTest1Dlg>(_T("Test1.dll"), 10); if (pTest1Dlg != nullptr) { // 后续业务逻辑 } // 加载Test2.dll获取CTest2Dlg实例 CTest2Dlg* pTest2Dlg = ShowDlgFromDll<CTest2Dlg>(_T("Test2.dll"), 20); if (pTest2Dlg != nullptr) { // 后续业务逻辑 }
注意事项
- 所有对接的DLL导出函数签名必须统一:返回对应对话框类指针、入参为int类型、导出函数名固定为
ShowDlg,如果函数名不固定可新增字符串入参传入自定义函数名 - 如果返回的对话框生命周期长于调用时机,不要在封装函数内释放DLL句柄,避免对话框资源被提前释放
- 注意保持项目字符集和LoadLibrary传入的字符串格式一致
内容的提问来源于stack exchange,提问作者wsy
相关产品推荐
相关产品推荐

