MFC规则动态库

一、概述

  “是MFC的”意味着可以在这种DLL的内部调用MFC类库中的内容;“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以调用MFC类库,但是其与应用程序的接口不能是MFC,而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类;规则DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。

二、分类

  MFC规则动态库分为:

    ①作为静态链接的MFC规则DLL

      该DLL可与MFC类库静态链接,将所调用的MFC类库的代码直接生成在.dll文件中,因此该DLL不需要进行模块状态的切换;但该DLL中可能存在重复代码,文件较大

    ②作为动态链接的共享MFC规则DLL

      该DLL可以和调用它的可执行程序同时动态链接到MFC动态库和MFC扩展动态库,当执行程序调用了该DLL后又在其程序内部用资源句柄加载了MFC资源模板时,执行程序总是默认调用程序内部加载的MFC资源而不是该DLL中链接到的MFC资源,若该DLL和执行程序内部存在相同ID的资源,会导致资源重复问题使系统不能获得正确的资源,因此该DLL须进行模块状态切换,以确定指向的资源模板

    ①创建作为静态链接的MFC规则DLL:

      1)创建新工程:MFC AppWizard(dll)

        

        

        第一部分:选择DLL的类型:作为静态链接的MFC规则DLL、作为动态链接的共享MFC规则DLL、MFC扩展动态库

        第二部分:是否支持自动化技术,“自动”允许在一个程序中操控另一个程序或组件;是否支持Windows Sockets(网络通信),允许程序在TCP/IP网络上进行通信

        第三部分:是否由MFC向导自动在源代码中添加注释

      2)创建完成后自动在工作区生成工程,并包含了如下文件结构:

        

        

    ②创建作为动态链接的共享MFC规则DLL:

      模块状态切换的方法:

        方法一:在DLL接口函数中使用:AFX_MANAGE_STATE(AfxGetStaticModuleState());

           在接口函数退出后,恢复为执行程序内部资源句柄加载的资源

        方法二:  //状态变更

          HINSTANCE save_hInstance=AfxGetResourceHandle();  //获取当前资源模块句柄

          AfxSetResourceHandle(程序目前要使用的资源模块句柄);  //设置新的资源模块句柄

                |--操作

          //状态还原

          AfxSetResourceHandle(save_hInstance);             //设置回原资源模块句柄

                |--再操作,无须退出即恢复为原执行程序加载的资源

        方法三:在执行程序的调用资源模块句柄的函数中切换:

          //获取默认的执行程序自己加载的资源模块句柄

          HINSTANCE exe_hInstance = AfxGetResourceHandle(); 

          //获取包含所需资源模块句柄的共享MFC规则DLL库

          HINSTANCE dll_hInstance = GetModuleHandle("共享MFC规则DLL.dll"); 

          AfxSetResourceHandle(dll_hInstance);  //切换状态

                |--操作

          AfxSetResourceHandle(exe_hInstance);  //恢复状态

                |--再操作,即恢复为默认的执行程序自己加载的资源模块

原文地址:https://www.cnblogs.com/zhouwanqiu/p/6921377.html