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

  1. INT_PTR CDllDialog::DoModal()  
  2.   
  3. {  
  4.   
  5.  // 获取老句柄   
  6.  HINSTANCE old_hInstance = AfxGetResourceHandle();  
  7.   
  8.   // 获取动态库实例   
  9.   
  10.  HINSTANCE dll_hInstance = GetModuleHandle(_T("DialogDll.dll"));  
  11.   
  12.   // 设置资源模块句柄为动态库资源句柄   
  13.   
  14.  AfxSetResourceHandle(dll_hInstance);  
  15.   
  16.    // 调用CDialog::DoModal()函数   
  17.   
  18.  INT_PTR ptr = CDialog::DoModal();  
  19.   
  20.    // 还原资源句柄   
  21.   
  22.  AfxSetResourceHandle(old_hInstance);  
  23.   
  24.  return ptr;  
  25.   
  26. }  
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应用程序中添加菜单响应事件:

  1. // CTestDialogDoc 命令   
  2.   
  3. #include"DllDialog.h"   
  4.   
  5. #include "ExeDialog.h"   
  6.   
  7. void CTestDialogDoc::OnTest()  
  8.   
  9. {  
  10.   
  11.  // TODO: 在此添加命令处理程序代码   
  12.   
  13.  CDllDialog dlldlg;  
  14.   
  15.  dlldlg.DoModal();  
  16.   
  17.  CExeDialog exedlg;  
  18.   
  19.  exedlg.DoModal();  
  20.   
  21. }  

 

 

 

http://blog.csdn.net/zhouschina/article/details/11950707
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值