DLL详解(下)---MFC下的DLL

本文详细介绍了MFC规则DLL,包括其概念、创建过程和两种类型:静态链接MFC及使用共享MFC DLL。重点讨论了资源模块句柄的切换方法,以及如何在DLL中初始化和终止MFC任务。此外,还对比了MFC规则DLL与MFC扩展DLL的区别和要求。
摘要由CSDN通过智能技术生成


(本文针对的是使用MFC下的DLL)

MFC规则DLL

何为规则DLL(Regular DLL)

(1)该DLL是基于MFC的,可以在这种DLL内部使用MFC。
(2)该DLL是"规则"的,它不同于"MFC扩展DLL",在规则DLL中内部虽然是可以使用MFC,但是规则DLL的接口应该不能是基于MFC的。而MFC扩展DLL与应用程序接口可以是MFC,可以从MFC扩展dll中导出一个MFC的派生类。

Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。

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

模块的切换有三种方式:

  1. 在DLL函数中调用AFX_MANAGE_STATE(AfxGetStaticModuleState());

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

    AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。

    我们将DLL中的接口函数ShowDlg改为:

    void ShowDlg(void)   
    {
            
        //方法2的状态变更   
         HINSTANCE save_hInstance = AfxGetResourceHandle()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值