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

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

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