zoukankan      html  css  js  c++  java
  • AFX_MANAGE_STATE,DLL关于资源切换

    应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。
      共享MFC DLL(或MFC扩展DLL)的规则DLL涉及到HINSTANCE句柄问题,HINSTANCE句柄对于加载资源特别重要。EXE和DLL都有其自己的资源,而且这些资源的ID可能重复,应用程序需要通过资源模块的切换来找到正确的资源。如果应用程序需要来自于DLL的资源,就应将资源模块句柄指定为 DLL的模块句柄;如果需要EXE文件中包含的资源,就应将资源模块句柄指定为EXE的模块句柄。
    模块的切换有三种方式:


    (1)在DLL函数中调用:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());(推荐使用,最简单)

    void ShowDlg(void)
    {
    //方法1:在函数开始处变更,在函数结束时恢复
    //将AFX_MANAGE_STATE(AfxGetStaticModuleState());作为接口函数的第一//条语句进行模块状态切换
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    CDialog dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框
    dlg.DoModal();
    }

    HINSTANCE hSaveInst = AfxGetResourceHandle();
        AfxSetResourceHandle(theApp.m_hInstance);
        //... ... 执行语句;
        AfxSetResourceHandle(hSaveInst);

        HINSTANCE hExeInst = GetModuleHandle(NULL);
        HINSTANCE hDLLInst = GetModuleHandle(_T("MFCDLL.dll"));
        ASSERT(hExeInst && hDLLInst);
        AfxSetResourceHandle(hDLLInst);
        //... ... 执行语句;
        AfxSetResourceHandle(hExeInst);

    ★最方便的还是第一种方法,前两种是在DLL导出函数中进行添加,第三种是在EXE程序中进行添加。

  • 相关阅读:
    蓝桥杯_买不到的数目
    蓝桥杯_错误票据
    蓝桥杯_数组操作
    剑指OFFER_把二叉树打印成多行
    C语言学习笔记_结构体的内存对齐
    剑指OFFER_二叉搜索树的第k个节点
    局域网ftp工具,带你去探索局域网ftp工具
    这就是Java代码生成器的制作流程(转载)
    ftp工具 绿色,一款非常棒的绿色 ftp工具
    HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统(转载)
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12538115.html
Copyright © 2011-2022 走看看