模块切换——MFC的规则DLL中资源使用的问题
来源:互联网 发布:条形码数据库手机软件 编辑:程序博客网 时间:2024/05/16 14:05
今天刚刚做了一个静态链接到MFC的规则dll,即“Use MFC in a static library“,该dll用来显示一个窗体。然后在一个mfc可执行程序A.exe中调用这个dll文件,可以正常的显示窗体。但后来做了一点小小的改动,即把dll改成动态连接到MFC的dll,即“Use MFC in a shared dll ”,然后在A.exe中调用该dll,结果窗体怎么都不显示。后来,经过仔细的分析,原因如下:
动态连接到MFC的dll,可以喝使用它的可执行程序同时连接到MFC DLL和任何MFC 扩展DLL。在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序(本例中是A.exe)的资源句柄来加载资源模板。这样,当dll和应用程序中存在相同的ID的资源时,系统总是默认使用应用程序的资源,故不能获得正确的资源。所以,在共享MFC DLL的规则DLL,我们必须进行模块切换,使得MFC能够找到正确的资源模板。
共有三种方法:
1. 在dll中自动切换,在dll的显示窗体的接口函数中使用AFX_MANAGE_STATE(AfxGetStaticModuleState()),如下:
void ShowDlg(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialog1 dlg;
dlg.DoModal();
}
2. 在dll中手动切换,如下:
void ShowDlg(void)
{
HINSTANCE save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance); //切换为dll
CDialog1 dlg;
dlg.DoModal();
AfxSetResourceHandle(save_hInstance); //还原为可执行程序
}
3. 在应用程序中自由切换
dll中的不做任何改动,如下
void ShowDlg(void)
{
CDialog1 dlg;
dlg.DoModal();
}
而在应用程序中调用该dll的地方作如下改动:
HINSTANCE hExe=GetModuleHandle(NULL);//获取exe模块句柄
HINSTANCE hDll=GetModuleHandle("1.dll");//获取dll模块句柄
AfxSetResourceHandle(hDll); //切换为dll
ShowDlg();//调用dll中的ShowDlg()函数
AfxSetResourceHandle(hExe); //还原为可执行程序
- 模块切换——MFC的规则DLL中资源使用的问题
- MFC的规则DLL中资源使用的问题
- MFC 规则dll 共享(动态链接)MFCDLL,资源模块的切换
- MFC + 线程访问窗口资源的问题(规则DLL)
- [MFC]MFC下的DLL编程——规则DLL
- MFC DLL 资源模块句柄切换
- MFC DLL 资源模块句柄切换
- WIN32 DLL中使用MFC的问题
- MFC DLL的规则
- 分析在MFC正规dll中使用资源的方法
- 分析在MFC正规dll中使用资源的方法
- MFC扩展dll里导出函数时资源切换的问题
- MFC扩展dll里导出函数时资源切换的问题
- dll模块资源切换
- DLL+资源模块切换
- MFC共享DLL模块状态的切换AFX_MODULE_STATE
- 关于MFC共享DLL的模块状态切换
- MFC共享DLL模块状态的切换AFX_MODULE_STATE
- MSSQL ORALCE 数据类型 对应
- flv视频转换软件 ImTOO FLV Converter
- linux设备驱动程序开发环境的建立(编译嵌入式内核)
- 关于Android中由 Thread 、Handler、MessageQueue、Looper组成的“线程间通信 套件” 的分析
- BREW与面向对象的比较
- 模块切换——MFC的规则DLL中资源使用的问题
- JS截取井号之前的URL,并实现页面跳转
- PHP中字符串的使用
- 关于IAP和ISP
- 当局者迷
- 6月13日任务
- 【小结】Zend Framework Quick Start 之Create A Layout
- Java随机数总结
- WCF Notification on Disconnect