AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
来源:互联网 发布:微信java通用版下载 编辑:程序博客网 时间:2024/06/03 20:06
先看一个例子:
1、创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源。指定该对话框ID如下:
2、创建一个基于对话框的mfc应用程序,它包含两个对话框资源,IDD_UI_DIALOG和IDD_EXE_DIALOG。并将后者的ID指定如下:
其中前者是这个应用程序的用户界面,单击上面的按钮,将弹出一个对话框。部分代码如下:
// in DLL
void CDLL::ShowDlg(void)
{
}
// in EXE
void CEXE::OnButtonClick()
{
}
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。
// in DLL
void CDLL::ShowDlg(void)
{
}
注:AFX_MANAGE_STATE(AfxGetStaticModuleState());一定是作为接口函数的第一条语句。
方法2。
// in DLL
void CDLL::ShowDlg(void)
{
}
注:AfxGetResourceHandle:获取当前资源模块句柄;AfxSetResourceHandle:设置程序目前要使用的资源模块句柄。
2、在应用程序中改进:
// in EXE
void CEXE::OnButtonClick()
{
}
注:使用状态切换的情况:当DLL导出函数包含MFC资源、类或者需要创建窗口时。
track: http://tech.163.com/06/0316/10/2CB1FGNG0009159F_4.html
- AFX_MANAGE_STATE(AfxGetStaticModuleState()) DLL资源
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
- AFX_MANAGE_STATE (AfxGetStaticModuleState())解决dll 、多线程访问资源问题
- MFC DLL中的AFX_MANAGE_STATE(AfxGetStaticModuleState())
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState())
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState())
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState())
- 转MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState())
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState())
- AFX_MANAGE_STATE(AfxGetStaticModuleState())
- AFX_MANAGE_STATE(AfxGetStaticModuleState())
- AFX_MANAGE_STATE(AfxGetStaticModuleState())
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- AFX_MANAGE_STATE(AfxGetStaticModuleState())
- AFX_MANAGE_STATE(AfxGetStaticModuleState())
- 请解释以下keywords的区别: assign vs weak, __block vs __weak
- JavaScript Detach 方式传递参数
- js 全选反选
- PAT1027 打印沙漏(20)
- Django如何连接mysql数据库
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL资源
- 策略模式(使用Java实现)
- android 之context 详解
- python setuptools工具打包
- HTTP请求中如何选择Get和Post方式
- winform flash
- git快速使用
- Option Explicit语句的重要性
- 虚继承与虚函数继承