…………………………………………………………Page 660……………………………………………………………
}
现在编译并运行程序。当主窗口出现后,选择 “线程”主菜单中的
“启动线程”菜单选项。过5秒种后,弹出两个消息框告诉你线程1和
线程2拥有访问资源的权限。再过5秒钟,第三个消息框弹出告诉你线
程3也拥有了访问资源的权限。线程3之所以5秒钟以后才出现,如图
12。5所示。因为线程1和线程2首先占有了资源的控制权。信号量被设
置成同一时刻只能有两个线程访问资源,所以第三个线程必须等待直
到前两个线程释放对信号量的所有权。
图12。 5 线程3拥有访问权限
…………………………………………………………Page 661……………………………………………………………
第十三章 动态链接库
在Windows应用程序中使用动态链接库有很多的好处。最主要的一点
说是它可以使得多个应用程序共享一段代码,从而可以大幅度的降低
应用程序的资源开销,同时很缩小了应用程序的最终执行代码的大
小。此外,通过使用动态链接库,我们可以把一些常规的例程独立出
来,有效的避免了不必要的重复开发,并且,由于应用程序使用了动
态链接的方式,还可以在不需重新改写甚至编译应用程序的基础上更
新应用程序的某些组件。
本章介绍Visual C++ 5。0中的动态链接库的创建和使用。这些内容包
括
l 为什么要使用DLL
l 不同的DLL类型之间的选择
l 在程序中创建和使用DLL
l 使用DLL扩展MFC
本章的重点在讲述Win32 DLL和基于MFC的常规DLL,对于MFC扩展DLL
仅给了一个很简单的例子,更深入的资料请参阅Visual C++的联机文
档。
第一节 概述
动态链接库 (DLL,Dynamic…Link Library)也是一种可执行文件,
只不过它不能象普通的EXE文件那样可以直接运行,而是用来为其它
可执行文件 (包括EXE文件和其它DLL)提供共享函数库。使用DLL的
应用程序可以调用DLL中的导出函数 (imported function),不过在
应用程序本身的执行代码中并不包含这些函数的执行代码,它们经过
编译和链接之后,独立的保存在DLL中。这是一种和过去常用的静态
链接不同的方式,使用静态链接库 (static link library)的应用
程序从函数库得到所引用的函数的执行代码,然后把执行代码放进 自
身的执行文件中,这样,应用程序在运行时就可以不再需要静态函数
库的支持。而使用DLL的应用程序只包括了用于从DLL中定位所引用的
函数的信息,而没有函数具体实现,要等到程序运行时才从DLL中获
得函数的实现代码。显然,使用了DLL的应用程序在运行时必须要有
相应的DLL的支持。
…………………………………………………………Page 662……………………………………………………………
DLL在Windows编程中得到了广泛的应用。Windows应用程序的基础:
Windows API函数中的相当部分就是由一组DLL所提供的,这些DLL从
安装Windows起就存在于系统中了。尽管在前面的几章中我们没有明
确的提到,但事实上我们早就在使用DLL进行编程了,只不过,所使
用的DLL都是现成的,并且所有调用DLL的操作都由Visual C++的编译
和链接程序替我们完成了。
本章将详细的介绍如何创建自己的DLL和如何使用自己创建的DLL进行
编程。
为什么要使用DLL呢?这当然是因为与传统的静态链库相比,使用DLL
有着更多的优势:
l 使用DLL提供了一种共享数据和代码的方便途径。并且,由于多个
应用程序可以共享同一个DLL中的函数,因此,使用DLL可以显著
的节省磁盘空间。尤其对于Windows应用程序,有很多的操作都是
“标准化”了的,如果使用传统的静态链接,每一个需要完成这
些操作的应用程序都必须在自己的执行文件中包括相同的执行代
码,这不但使单个的应用程序变得更长,也浪费了磁盘空间。
l 由于相同的原因,多个应用程序还可以同时共享DLL在内存中的同
一份拷贝,这样就有效的节省了应用程序所占用的内存资源,减
少了频繁的内存交换,从而提高了应用程序的执行效率。
l 由于DLL是独立于可执行文件的,因此,如果需要向DLL中增加新
的函数或是增强现有函数的功能,只要原有函数的参数和返回值
等属性不变,那么,所有使用该DLL的原有应用程序都可以在升级
后的DLL的支持下运行,而不需要重新编译。这就极大的方便了应
用程序的升级和售后支持。
l DLL除了包括函数的执行代码以外,还可以只包括如图标、位图、
字符串和对话框之类的资源,因此可以把应用程序所使用的资源
独立出来做成DLL。对于一些常用的资源,把它们做到DLL中后,
就可为多个应用程序所共享。
l 便于建立多语言的应用程序。我们可以把多语言应用程序中所使
用的与语言相关的函数做到DLL中,只要不同语言的应用程序所调
用的函数都具有相同的接口,这样就可以通过简单地更换DLL来实
现多语言支持。
然而,使用DLL也有其不足之处。最典型的就是应用程序在运行时必
…………………………………………………………Page 663……………………………………………………………
须要有相应的DLL的支持。另外,使用DLL也增大了程序运行的开销,
好在这种额外的开销对于大多数应用程序的影响并不明显,我们也只
是在某些对运行速度要求苛刻的特殊场合,才不得不考虑这一点。
Visual C++ 5。0支持多种DLL,包括:
l 非MFC DLL
l 静态链接到MFC的常规DLL
l 动态链接到MFC的常规DLL
l MFC扩展DLL
其中非MFC DLL (non…MFC DLL )内部不使用MFC,调用非MFC DLL提供
的导出函数的可执行程序可以使用MFC,也可以不使用MFC。一般来
standard C
说,非MFC DLL的导出函数都使用标准的C接口 (
interface)。
其余三种DLL的内部都使用了MFC。顾名思义,静态链接到MFC的常规
DLL (regular DLL statically linking to MFC)和动态链接到MFC
的常规DLL (regular DLL dynamically linking to MFC)的区别在
于一个使用的是MFC的静态链接库,而另一个使用的是MFC的DLL。这
和一般的MFC应用程序的情况是很类似的。
MFC扩展DLL一般用来提供派生于MFC的可重用的类,以扩展已有的MFC
类库的功能。MFC扩展DLL使用MFC的动态链接版本。只有使用MFC动态
链接的可执行程序 (无论是EXE还是DLL)才能访问MFC扩展DLL。MFC
扩展DLL的另一个有用的功能是它可以在应用程序和它所加载的MFC扩
展DLL之间传递MFC和MFC派生对象的指针。在其它情况下,这样做是
可能导致问题的。
l 注意:
l 只有Visual C++ 5。0的专业版和企业版才支持到MFC的静态链接。
l 静态链接到MFC的常规DLL过去的USRDLL有着相同的特性,同样
的,MFC扩展DLL和过去的AFXDLL有着相同的特性。在Visual C++
5。0中已不再使用USRDLL和AFXDLL这两个术语。
如何选择所应该使用的DLL的类型呢?我们可以从以下几个方面来考
虑:
…………………………………………………………Page 664……………………………………………………………
l 相比使用了MFC的DLL而言,非MFC DLL显得更为短小精悍。因此,
如果DLL不需要使用MFC,那么使用非MFC DLL是一个很好的选择,
它将显著地节省磁盘和内存空间。同时,无论应用程序是否使用
了MFC,都可以调用非MFC DLL中所导
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 其他
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 其他
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 其他
- 最新章:第27章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 其他
- 最新章:第26章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 其他
- 最新章:第17章
- Linux实用培训教程(PDF)
- -Page 1-rrktqt的个人空间 Linux实用培训教程第一部分 作者:红联Linux实用培训教程第一部分-共三部分解的Linux知识,循序渐进的介绍Linux相关知识,从入门到提高,希望对所有学习Linux的朋友都有帮助 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章
- 其他
- 最新章:第42章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 其他
- 最新章:第31章
- 路由器基本知识及应用实例(DOC格式)
- 第二章 路由器第一节 路由器发展概述自从1984年问世至今,路由器已经走过了近20年的快速技术发展历程。路由器的应用领域不断扩展、从单一的互通网关逐渐扩展到覆盖广域网、城域网乃至用户接入的各个领域。近年来,路由器早已逐渐脱离单纯用于企业网出口和互联的概念,开始成为运营网络和各种专用业务网络的核心设备
- 其他
- 最新章:第48章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 其他
- 最新章:第295章