exe调用dll中的对话框防资源防冲突解决办法
2016-10-08 12:30
302 查看
在编写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 AFXA
bc8e
PI AfxGetResourceHandle();
// 设置当前资源模块句柄
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
于是在dll工程中对需要导出的对话框重载DoModal()函数
[cpp] view
plain copy
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应用程序中添加菜单响应事件:
程序首先检测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 AFXA
bc8e
PI AfxGetResourceHandle();
// 设置当前资源模块句柄
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
于是在dll工程中对需要导出的对话框重载DoModal()函数
[cpp] view
plain copy
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应用程序中添加菜单响应事件:
相关文章推荐
- exe调用dll中的对话框防资源冲突解决之道
- exe调用dll中的对话框防资源冲突解决之道
- exe调用dll中的对话框防资源冲突解决之道
- svchost.exe占用CPU资源过高的解决办法
- windows2000server下 iis 无法下载 .exe , .dll文件的解决办法。
- Delphi7程序调用C#写的DLL解决办法
- 扩展DLL调用扩展DLL的LINK2001错误的解决办法之一
- 调用"/Windows/wceload.exe /noui /Windows/System_SR_chs_wm.cab"后返回了部署后错误 0x00000001 的解决办法
- 【转】Delphi7程序调用C#写的DLL解决办法
- VC++MFC 调用DLL里的对话框资源
- 木马病毒winasse.exe、vbarun.dll的解决办法
- 引用dll导致的资源id冲突解决方法
- Delphi7程序调用C#写的DLL解决办法(DLL)
- Delphi7程序调用C#写的DLL解决办法
- 调用"/Windows/wceload.exe /noui /Windows/System_SR_chs_wm.cab"后返回了部署后错误 0x00000001 的解决办法
- Delphi7程序调用C#写的DLL解决办法
- cidaemon.exe进程占用CPU资源的解决办法
- 动态调用DLL老报错的解决办法
- java调用dll,报java.lang.UnsatisfiedLinkError错的解决办法
- 在EXE程序中调用DLL文件后出现_CrtIsValidHeapPointer(pUserData)问题的解决方法