按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
…………………………………………………………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中所导出的函数。
l 如果需要创建使用了MFC的DLL,并希望MFC和非MFC应用程序都能
使用所创建的DLL,那么可以选择的范围包括静态链接到MFC的常
规DLL和动态链接到MFC的常规DLL。动态链接到MFC的常规DLL比较
短小,因此可以节省磁盘和内存,但是,在分发动态链接到MFC的
常规DLL时,必须同时分发MFC的支持DLL,如MFCx0。DLL和
MSVCRT。DLL等。而使用静态链接到MFC的常规DLL则不存在这种问
题。
l 如果希望在DLL中实现从MFC派生的可重用的类,或者是希望在应
用程序和DLL之间传递MFC的派生对象时,必须选择MFC扩展DLL。
第二节 创建和使用动态链接库
本节以非MFC DLL为例来讲解DLL的结构和导出方法,并介绍创建和使
用DLL的方法和步骤。
13。2。1 DLL的结构和导出方式
DLL文件和EXE文件都属于可执行文件,不同的是DLL文件包括了一个
导出表,导出表中给出了可以从DLL中导出的所有函数的名字。外部
可执行程序只能访问包括在DLL的导出表中的函数,DLL中的其它函数
是私有的,不能为外部可执行程序所访问。
可以使用Visual C++提供的DUMPBIN实用程序 (可以在
DevStudioVCbin 目录下找到这个工具)来查看一个DLL文件的结
构。举一个例子,如果需要查看DLL文件msgbox。dll (我们将在本小
节的后续内容中创建该DLL)的导出表,可以在命令提示符下键入下
面的命令:
》dumpbin /exports msgbox。dll
运行结果如下:
Microsoft (R) COFF Binary File Dumper Version 5。00。7022
Copyright (C) Microsoft Corp 1992…1997。 All rights reserved。
Dump of file msgbox。dll
…………………………………………………………Page 665……………………………………………………………
File Type: DLL
Section contains the following Exports for MSGBOX。dll
0 characteristics
351643C3 time date stamp Mon Mar 23 19:13:07 1998
0。00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint name
1 0 MsgBox (00001000)
Summary
7000 。data
1000 。idata
2000 。rdata
2000 。reloc
17000 。text
由上面的结果得知,msgbox。dll中仅包括了一个导出函数MsgBo