MFC的规则DLL与扩展DLL

一.MFC规则DLL

MFC规则DLL可以在该dll内部使用MFC,但是与应用程序的接口不能是MFC的。能够被所有支持dll的编程语言所写的应用程序使用,当然也包括使用MFC创建的应用程序。在这种动态链接库中包含一个从CWinApp中继承而来的类,DllMain函数也被隐藏在其中了。

规则DLL包含俩类——静态链接到MFC上和动态连接到MFC上。静态链接到MFC上的规则DLL与MFC静态链接,将MFC的dll代码直接生成在该.dll中,在调用该dll时,使用的是该dll的资源句柄 ;动态链接到MFC上的规则DLL可以和使用它的应用程序同时动态链接到MFC的dll和MFC的扩展dll上,此时,MFC使用主应用程序的资源句柄加载资源模板,这样,如果主应用程序和dll中有相同的资源ID时,就出现了问题,此时需要进行模块转换,才能正确的家在资源。

这里通过1.使用AFX_MANAGE_STATE(AfxGetStaticModuleState())作为接口的第一条语句进行模块状态转换;AFX_MOUDLE_STATE * AFXAPI AfxGetStaticModuleState(),该函数返回当前模块状态,AFX_MANAGE_STATE(AFX_MOUDLE_STATE * pMoudleState),该宏用于将pMoudleState设置为当前模块状态,当宏的作用域结束后,也就是离开pMoudleState所指向栈上对象的作用域时,AFX_MOUDLE_STATE的析构函数完成模块状态的恢复;

2.AfxGetResourceHandle()//获取程序当前正在使用的模块句柄,AfxSetResourceHandle()//设置程序需要使用的模块句柄,在接口函数开始时进行模块状态转换,HINSTANCE old_hInstance=AfxGetResourceHandle(); AfxSetResourceHandle(当前dll的句柄,可以使用theApp.m_hInstance);后面是函数的其余部分,结尾处AfxSetResourceHandle(old_hInstance);将模块状态再次转换过来;该方法可以用在dll中,也可以用在应用程序调用该dll函数之前之后;

二.MFC的扩展DLL

MFC的扩展DLL的内涵是MFC的扩展,用户使用MFC的扩展DLL就像使用MFC本身的DLL一样,除了可以在MFC的扩展DLL内部使用MFC外,MFC的扩展DLL与应用程序的接口也可以是MFC,一般使用MFC的扩展DLL来增强MFC的功能,使用vc++向导生成的MFC的扩展DLL会自动生成DllMain()函数。由MFC扩展的DLL导出的函数,变量和其他很相似,对于导出类,应该在声明类的前面加上AFX_EXT_CLASS。

在 DLL 的头文件中,将 AFX_EXT_CLASS 关键字添加到类的声明中,如下所示:

class AFX_EXT_CLASS CMyClass : public Cdocument {// <body of class>};

当定义了预处理 _AFXDLL 和 _AFXEXT 时,该宏被 MFC 定义为__declspec(dllexport)。 但当定义了 _AFXDLL 而未定义 _AFXEXT 时,该宏被定义为__declspec(dllimport)。定义后,预处理器符号 _AFXDLL 指示共享 MFC 版本正在由目标可执行文件(DLL 或应用程序)使用。当 _AFXDLL 和 _AFXEXT 都定义了时,这指示目标可执行文件是扩展 DLL。

本文转自http://yanguohong0925.blog.163.com/blog/static/928698420104129560808/

MFC的规则DLL与扩展DLL,布布扣,bubuko.com

时间: 2025-01-03 22:40:55

MFC的规则DLL与扩展DLL的相关文章

(转载)DLL动态链接库编程入门之五:MFC扩展DLL

MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用MFC本身的DLL一样.除了可以在MFC扩展DLL的内部使用MFC以外,MFC扩展DLL与应用程序的接口部分也可以是MFC.我们一般使用MFC扩展DLL来包含一些MFC的增强功能,譬如扩展MFC的CStatic.CButton等类使之具备更强大的能力. 使用Visual C++向导生产MFC扩展DLL时,MFC向导会自动增加DLL的入口函数DllMain: C++代码 extern "C" int APIENTRY

四种DLL:NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL

参考资料: https://msdn.microsoft.com/en-us/library/30c674tx.aspx 在上面给出的MSDN链接中,你可以看到四种DLL的定义.这里就不赘述.捡重点的说 区别就在于: NON-MFC DLL内部不能使用MFC(当然其导出的API也不能涉及MFC).(这里我说“导出的API”是指导出的C函数.C++类或者共享的全局变量等等) Regular DLL Statically/Dynamically linked to MFC内部可以使用MFC,但是其导

MFC 加载链接库(DLL)错误

我用的是VS2010 在用WMI获取电脑系统信息时,要使用到win系统的dll, 错误1: 错误提示:Error 1error C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]f:\vs2010u\vc\atlmfc\include\afx.h 241

使用C语言来扩展PHP,写PHP扩展dll

转自http://www.cnblogs.com/myths/archive/2011/11/28/2266593.html 以前写过一次PHP扩展DLL,那个是利用调用系统的COM口实现的扩展,与PHP不能真正融合.心血来潮,研究了一下PHP的源码,网上找了一些资料,自己尝试写了一个扩展DLL,测试没问题.下面记录一下具体扩展方法: 1.首先从www.php.net网站上下载php源码,此处以php-5.2.17版本为例,下载后解压至E:盘根目录下(目录可以自己随意定). 2.下载安装VC++

Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version

错误提示:Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version 出现以上情况 解决方法 在 项目/属性/常规/use of MFC 选项中选择 Use MFC in a Shared DLL 编译后通过.

fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC sha

调试程序时出现以下问题:d:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(24): fatal error C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD

Windows下PHP安装扩展dll

今天做PHP实验需要连接MySQL数据库,我电脑上之前已经安装了MySQL服务,所以想直接用之前安装的MySQL,不用XAMPP里的MySQL了. 折腾了好长时间,总是提示 Warning: mysqli::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in F:\xampp\htdocs\Test\test.php on line 1

加载php_curl.dll和php_openssl.dll出错原因及解决办法

今天在XP下安装PHP开发环境时,需要加载php_curl.dll这个动态库,自己想当然的在php.ini里把extension=php_curl.dll打开以为就可以了.可以在apache的logs里面依然会报错,提示找不到php_curl.dll这个文件,我的extension_dir也配置php/ext这个目录下面,而且ext这个目录下面也有php_curl.dll这个文件,为什么找不到呢,着实让人挺纳闷的. 网上的资料都是说extension_dir的路径没有配置或是没有打开extens

mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)

原文地址:mingw qt作者:孙1东 不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -no-script -no-scripttools -nomake tools -nomake examples -nomake demos -nomake docs -