首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

exe调用dll中的对话框防资源矛盾解决之道

2013-10-08 
exe调用dll中的对话框防资源冲突解决之道在编写MFC应用程序时,有时我们希望将对话框封装在dll动态库中。但

exe调用dll中的对话框防资源冲突解决之道

在编写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()函数

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中的对话框防资源矛盾解决之道

热点排行