先看一个例子:
1、创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源。指定该对话框ID如下:
#define IDD_DLL_DIALOG 2000
2、创建一个基于对话框的mfc应用程序,它包含两个对话框资源,IDD_UI_DIALOG和IDD_EXE_DIALOG。并将后者的ID指定如下:
#define IDD_EXE_DIALOG 2000
其中前者是这个应用程序的用户界面,单击上面的按钮,将弹出一个对话框。部分代码如下:
3、单击按钮,弹出的不是期望的DLL中的对话框IDD_DLL_DIALOG,而是应用程序中的对话框IDD_EXE_DIALOG。
解释:
1、应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了EXE或DLL模块在进程虚拟空间中的起始地址。(进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的HINSTANCE。应用程序在加载DLL时对其进行了重定位)。
2、共享MFC DLL(或MFC扩展DLL)的规则DLL涉及到HINSTANCE句柄问题,HINSTANCE句柄对于加载资源特别重要。EXE和DLL都有其自己的资源,而且这些资源的ID可能重复,如果应用程序与规则DLL共享MFC DLL(或MFC扩展DLL),那么将总是默认使用EXE的资源。
3、因此应用程序需要通过资源模块的切换来找到正确的资源。如果应用程序需要来自于DLL的资源,就应将资源模块句柄指定为DLL的模块句柄;如果需要EXE文件中包含的资源,就应将资源模块句柄指定为EXE的模块句柄。
解决办法:
1、在DLL中改进:
方法1。
注:AFX_MANAGE_STATE(AfxGetStaticModuleState());一定是作为接口函数的第一条语句。
其功能是在栈上(这意味着其作用域是局部的)创建一个AFX_MODULE_STATE类的实例,并将其指 针pModuleState返回。
AFX_MODULE_STATE类利用其构造函数和析构函数进行存储模块状态现场及恢复现场的工作。
该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指栈上对象的作用域),先前的模块状态将由类AFX_MODULE_STATE的析构函数恢复。(即自动恢复)
方法2。
注:AfxGetResourceHandle:获取当前资源模块句柄;AfxSetResourceHandle:设置程序目前要使用的资源模块句柄。
同方法1比较,方法2能够灵活地设置程序的资源模块句柄,而方法1则只能在DLL接口函数退出的时候才会恢复模块句柄。
2、在应用程序中改进:
注:使用状态切换的情况:当DLL导出函数包含MFC资源、类或者需要创建窗口时。
分享到:
相关推荐
MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中英文切换MFC中...
MFC vs2010多国语言切换,每种语言一个资源
MFC 语言切换 一个简单的小程序
可正常切换语言,还是不懂的话,可通过中断查看宏定义的资源代号,直接设置这个代号也能切换
MFC 多语言环境的实现,环境是win7+vs2010,亲自试过没有问题
MFC 单文档视图中进行多种视图的切换 MFC 单文档视图中进行多种视图的切换
MFC实现对话框内图片通过按钮切换,通过按钮切换5张图片,很实用的资源
控制了窗口的大小当拖动窗口缩小的添加的空间大小时,窗口不会再缩小了,实现了formview dialog对话框的布局,还有就是点击菜单项切换界面,
MFC多国语言的一种实现方法,使用VS2008编写,解压后有源码以及说明文档,简单易懂,是动态实现语言切换的非dll方法。
MFC上机的一些练习第一部分,后续还有234,1....3. 切换到资源视图,试着修改它的图标、标题(string table里改)和版本信息。运行程序查看修改结果。 4. 生成一个多文档应用程序,比较其与单文档窗口的不同。
利用载入位图,实现OnChange等函数,将放入资源的位图实现背景变换
本资源是c++课程结束后的课程设计,主要包含是11个MFC项目(1.在文本框中设计一个滚动字幕项目2.计算器的设计与实现项目3.画笔4.显示硬盘信息5.获取和修改计算机NetBIOS名称(缺oldname部分)6.关机、重启、切换用户...
9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理...
本资源是c++课程结束后的课程设计,主要包含是11个MFC项目(1.在文本框中设计一个滚动字幕项目2.计算器的设计与实现项目3.画笔4.显示硬盘信息5.获取和修改计算机NetBIOS名称(缺oldname部分)6.关机、重启、切换用户...
很经典的MFC教程。...15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339
简单的应用示例,包括窗口分割,控制面板和主显示区等,展示控件各方向停靠、自动充满、全屏切换、记忆窗口位置和大小、选项设置和保存注册表等功能,用户可直接以此为基础开发新项目。如需扩展其它功能,可从...
CMemoryDialog不需要创建资源,做为动态链接库使用时不用切换资源,支持模态、非模态调用。
该资源里面有一个可以实现点击一个窗口弹出另一个窗口的实例,还有一个本人在解决这个问题时所做的笔记。你们可对比实例和我的笔记来参考。
目 录 ...15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339
在本资源中,我们将分别使用MFC、Opencv库和FreeImage库来显示同一张BMP图像。下面是每种方法的详细讲解: MFC显示BMP图像 MFC(Microsoft Foundation Classes)是微软公司推出的一个基于C++的应用程序框架,提供...