MFC规则动态库

Posted Autumn の Box

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);  //恢复状态

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

 

以上是关于MFC规则动态库的主要内容,如果未能解决你的问题,请参考以下文章

在VS2015中用C++创建MFC规则动态库DLL

动态库(非MFC动态库)

72)MFC测试动态共享库

MFC调用C动态库函数-----待补充

MFC扩展动态库

DLL动态链接库如何共享数据和如何创建纯资源DLL