《C语言实例教程(PDF格式)》第137章


…………………………………………………………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中所导
小说推荐
返回首页返回目录