exe调用dll中的对话框防资源冲突解决之道
2013-09-23 20:49
211 查看
在编写MFC应用程序时,有时我们希望将对话框封装在dll动态库中。但当exe调用dll中对话框时:
程序首先检测exe中的资源如果存在对应的对话框ID,那么dll中的对话框将采用exe中的资源进行创建生成对话框,这样就违背了我们的意愿。
1)下面情况可以正确调用dll工程中对话框:
在exe工程资源中对话框ID为
#define IDD_EXE_DIALOG 5000
在dll工程中对话框ID为
#define IDD_DLL_DIALOG 5001
2)下面情况可以错误调用了EXE工程中对话框:
在exe工程资源中对话框ID为
#define IDD_EXE_DIALOG 5000
在dll工程中对话框ID为
#define IDD_DLL_DIALOG 5000
对话框ID都是Visual Studio自动生成的,人工修改ID,到达资源不冲突,对于小工程来说还能忍受。但对于几千个对话框,甚至上万的对话框资源来说也是一件麻烦的事。MFC提供了下面两个函数,于是我们只要在创建对话框之前对切换资源句柄即可。
// 获取当前资源模块句柄
HINSTANCE AFXAPI AfxGetResourceHandle();
// 设置当前资源模块句柄
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
于是在dll工程中对需要导出的对话框重载DoModal()函数
在exe应用程序中添加菜单响应事件:
程序首先检测exe中的资源如果存在对应的对话框ID,那么dll中的对话框将采用exe中的资源进行创建生成对话框,这样就违背了我们的意愿。
1)下面情况可以正确调用dll工程中对话框:
在exe工程资源中对话框ID为
#define IDD_EXE_DIALOG 5000
在dll工程中对话框ID为
#define IDD_DLL_DIALOG 5001
2)下面情况可以错误调用了EXE工程中对话框:
在exe工程资源中对话框ID为
#define IDD_EXE_DIALOG 5000
在dll工程中对话框ID为
#define IDD_DLL_DIALOG 5000
对话框ID都是Visual Studio自动生成的,人工修改ID,到达资源不冲突,对于小工程来说还能忍受。但对于几千个对话框,甚至上万的对话框资源来说也是一件麻烦的事。MFC提供了下面两个函数,于是我们只要在创建对话框之前对切换资源句柄即可。
// 获取当前资源模块句柄
HINSTANCE AFXAPI AfxGetResourceHandle();
// 设置当前资源模块句柄
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
于是在dll工程中对需要导出的对话框重载DoModal()函数
INT_PTR CDllDialog::DoModal() { // 获取老句柄 HINSTANCE old_hInstance = AfxGetResourceHandle(); // 获取动态库实例 HINSTANCE dll_hInstance = GetModuleHandle(_T("DialogDll.dll")); // 设置资源模块句柄为动态库资源句柄 AfxSetResourceHandle(dll_hInstance); // 调用CDialog::DoModal()函数 INT_PTR ptr = CDialog::DoModal(); // 还原资源句柄 AfxSetResourceHandle(old_hInstance); return ptr; }
在exe应用程序中添加菜单响应事件:
// CTestDialogDoc 命令 #include"DllDialog.h" #include "ExeDialog.h" void CTestDialogDoc::OnTest() { // TODO: 在此添加命令处理程序代码 CDllDialog dlldlg; dlldlg.DoModal(); CExeDialog exedlg; exedlg.DoModal(); }
相关文章推荐
- exe调用dll中的对话框防资源冲突解决之道
- exe调用dll中的对话框防资源冲突解决之道
- exe调用dll中的对话框防资源防冲突解决办法
- MFC扩展DLL调用对话框,测试的时候报错问题的解决
- 提示“dwwin.exe DLL 初始化失败”错误对话框的解决方法
- 在EXE程序中调用DLL文件后出现_CrtIsValidHeapPointer(pUserData)问题的解决方法
- VC++MFC 调用DLL里的对话框资源
- win32 DLL中创建的的对话框资源被应用程序调用无法识别的问题
- 写DLL引起与主程序资源冲突的解决方法
- MFC调用其它DLL的资源中包含自定义控件,显示不正常的解决方法
- web调用cab不能注册dll、不能运行exe文件问题解决
- 控制台应用程序调用MFC DLL产生的对话框,解决对话框dlg.DoModal报错问题
- dll中添加对话框资源,在dll外面调用
- 引用dll导致的资源id冲突解决方法
- 解决DLL和主调程序的资源冲突及如何使用Dll的资源
- 在DLL中使用资源 - 主要是解决DLL的对话框导出问题
- 引用dll导致的资源id冲突解决方法
- 7.VC(custom)-解决DLL和主调程序的资源冲突及如何使用Dll的资源
- 关于如何调用mfc带资源对话框的dll的简单演示
- MFC程序调用Dll中的对话框资源