技术标签: DLL 扩展DLL MFC MFC DLL 规则DLL
比较大的应用程序都是由很多模块组成的,这些模块彼此协作,以完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE 文件中,会产生一些问题。一是增加了应用程序的大小,这样会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另外,在编写大的EXE 程序时,每次修改重建时都必须调整编译所有源代码,不但增加了编译过程的复杂性,也不利于阶段性的单元测试。
Windows 系统平台上提供了一种完全不同的有效编程和运行环境,可以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library)文件,并可对它们单独进行编译和测试。在运行时,只有在EXE 程序确实要调用这些DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE 文件的大小和对内存空间的需求,而且使这些DLL 模块可以同时被多个应用程序使用,从而充分利用资源。
DLL动态链接库概论非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
MFC DLL
MFC dll有3种,分别为:
(1)使用共享MFC DLL的规则DLL
(2)带静态链接MFC的规则DLL
(3)MFC扩展DLL
下面重点解释一下这些DLL的含义区别:
1、规则DLL
首先谈谈所谓的"规则DLL":"规则DLL"是由"Regular DLL"翻译而来的。它实际上体现出来两方面的本质:下面再详细说明"规则DLL"的两个分类:
(1)使用共享MFC DLL的规则DLL该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指栈上对象的作用域),先前的模块状态将由类AFX_MODULE_STATE的析构函数恢复。
(2)带静态链接MFC的规则DLL这个不多讲,是将MFC dll编译到自身内部的DLL类型,对比"使用共享MFC DLL的规则DLL"不难理解;
(3)规则DLL中的调用约定和名称修饰:最后说明:关键字__cdecl、__stdcall和__fastcall可以直接加在要输出的函数前,也可以在编译环境的Setting...->C/C++->Code Generation项选择.它们对应的命令行参数分别为/Gd、/Gz和/Gr.缺省状态为/Gd,即__cdecl.当加在输出函数前的关键字与编译环境中的选择不同时,直接加在输出函数前的关键字有效.
(4)规则DLL的其他几点说明:2、MFC扩展DLL
MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。MFC扩展DLL使用MFC 动态链接库版本,因此只有用共享MFC版本生成的MFC可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。此类dll一般很少用,不多说。
(1) MFC规则DLL
MFC规则DLL可以在该dll内部使用MFC,但是与应用程序的接口不能是MFC的。能够被所有支持dll的编程语言所写的应用程序使用,当然也包括使用MFC创建的应用程序。在这种动态链接库中包含一个从CWinApp中继承而来的类,DllMain函数也被隐藏在其中了。2.AfxGetResourceHandle()//获取程序当前正在使用的模块句柄,AfxSetResourceHandle()//设置程序需要使用的模块句柄,在接口函数开始时进行模块状态转换,HINSTANCE old_hInstance=AfxGetResourceHandle(); AfxSetResourceHandle(当前dll的句柄,可以使用theApp.m_hInstance);后面是函数的其余部分,结尾处AfxSetResourceHandle(old_hInstance);将模块状态再次转换过来;该方法可以用在dll中,也可以用在应用程序调用该dll函数之前之后;
(2)MFC的扩展DLL当 _AFXDLL 和 _AFXEXT 都定义了时,这指示目标可执行文件是扩展 DLL。
转自:
文章浏览阅读522次。准备3个节点,我这里的IP及hostname分别是:192.168.31.164 mongodb-master192.168.31.165 mongodb-slave192.168.31.167 mongodb-arbiter版本:mongodb-linux-x86_64-rhel70-3.4.24.tgz同时节点需要完成:关闭防火墙、SSH..._mongoversion v3.4.24 replication: master
文章浏览阅读968次。Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。_iso-8859-1字符
文章浏览阅读89次。[code="java"]http://www.cnblogs.com/netfocus/p/5184182.html[/code]_汤雪华 阿里巴巴
文章浏览阅读1.6k次。Kun Qian, Zhaoyuan He, Xinyu ZhangUCSDProceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies (ACM IMWUT)内容在CSDN、知乎和微信公众号同步更新Extremely low resolution due to its small form factor only generates intensity maps with strong ref_xinyu zhang
文章浏览阅读2.3k次,点赞5次,收藏5次。(a % b + b) % b_负数对正数取模
文章浏览阅读182次。录制ios 命令行工具 机器学习和自然语言处理通过给人以声音来改变我们与设备的关系。 视障人士尤其从这些技术中受益,但大多数语音银行都把那些像我的母语Odia这样说英语的人基本抛在了后面。 当泰米尔语 维基百科上的 T. Shrinivasan开创了录音机语音教学工具时 ,他可能没有意识到他的开源工具对像我这样的用户有多大用处。 我在寻找一个简单的工具,该工具可以让我在短时间内记录大量单词,..._ios语音控制录制命令
文章浏览阅读4.6k次,点赞3次,收藏5次。Mxnet CustomOp_mxnet customop 训练慢
文章浏览阅读1.1k次。1、两个命令可以大写,也可以小写,因为window平台不区分大小写。2、java源文件文件名需与public类名一致,如果文件中无public类,文件名可以是任意标识符3、javac命令编译生成的class文件,有几个类就会生成几个文件4、格式:“javac –d 生成文件的保存路径 源文件路径”,建议总是写-d后面语句,好处就是如果原文件有包,会在当前目录自动生成包文件夹,如果..._javac 和java 执行的文件名可以不一样吗
文章浏览阅读1.8w次,点赞10次,收藏15次。Spring在没有引入注解之前,传统的Spring做法是使用.xml文件来对bean进行注入,所有的内容都需要配置在.xml文件中,使配置和编程分离,却增加了可读性和复杂度。 Spring注解将复杂的配置文件用简单@xxx代替,当出现一个接口多个实现类的时候,究竟是用的哪个实现类呢?示例代码:public interface DataDao{}_@resource 接口与service
文章浏览阅读1.7w次。导读由于ntp服务器时间的设置,网上错综复杂,资料很多,大家随便找个资料,这个不行,找另外的资料,总之对这个不是太了解,这里找了份资料,详细介绍了ntp。万变不离其中,明白了原理,ntp的配置就不在困难了。这里面解决了一些疑问:1.如何查看ntp是否配置成功?2.如何了解ntp列出的参数的含义?3.restrict关键字的作用是什么?# watch ntpq -_ntpq -p详解
文章浏览阅读1.8k次。写在前面:黄色部分,p是书上有公式的要动手写的部分及对应页码文章目录第五章:基带传输系统第六章二进制:M进制:第五章:基带传输系统:波形变换–>信道–>接受滤波器–>抽样判决数字基带信号:短距离有线传输,频谱范围WB 从直流或低频延伸至若干倍1/T数字载波调制信号:无线,光纤信道,经过调制实现信号频谱搬移基带信号码型的设计原则:1.不含直流分量2.高频分量少..._将基带信号转换成极性码,映射
文章浏览阅读404次。疱疹性结膜炎特征为角膜上皮呈树枝状病变,与树叶的叶脉相似,末端呈球形.早期症状为异物感,流泪,畏光和结膜充血,随着反复复发,角膜知觉减退或消失,结果可能引起角膜溃疡和永久性角膜瘢痕形成. 盘状角膜炎累及角膜基质,是角膜深层的盘状局限性水肿和混浊,伴有虹膜炎,常在上皮性角膜炎后发生.盘状角膜炎可能代表机体对病毒的免疫反应.不是由反复的单纯疱疹病毒引起的不愈合或愈合极慢的上皮性缺损,被称为无痛性溃疡._带状疱疹经历的四个阶段 知乎