友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第103章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!