软件开发通常是由许多人共同完成,每一个开发人员可能负责不同模块的编制。这些模块分别实现相对独立的功能,它们彼此协作来完成整个软件系统的工作。比如,上述的Entry函数就可以两个人分工完成,一个人负责编写Entry函数,另一个人负责编写Function函数,后者编写的代码最后要编译成动态链接库,Entry函数要调用动态链接库中的Function函数的代码,最终完成计算任务。
动态链接库作为软件系统的重要组成要素,为通用代码的重用提供了基础,也为多人的协作开发提供了可能。总结起来,使用动态链接库有如下几个方面的优点:
(1)实现代码、资源(数据)的共享,节省系统空间。
使用动态链接库的程序进行链接时,无需在编译时将库的代码拷贝,而只是在程序中记录函数的入口点(地址),直到程序执行时才装载DLL文件。因此,可以节省系统的存储空间:把一些通用的代码(函数)放到动态链接库中,不同的程序使用这些代码(函数)时,它们都是记录入口点,不用把代码完整的拷贝到自己的代码中,从而节省了硬盘空间;而且,当一个程序执行时,它所用到的动态链接库没有必要一次性的装入内存,可根据需要动态地加载,这样,又节省了内存空间。
另外,动态链接库除了包含函数的执行代码外,还可以只包含图标、位图、字符串和对话框甚至语言文字之类的资源,因此可以把应用程序所使用的资源独立出来做成DLL。对一些常用的资源,把它们做成DLL后,就可为多个应用程序共享。也可以把多语言应用程序所使用的与语言相关的函数或数据放到DLL中,只要不同语言应用程序所调用的函数或数据具有统一的使用方式(比如:使用指针间接访问等),就可以通过简单地更换DLL来实现多语言支持。
(2)实现系统模块化,便于升级。
如果将程序分成主程序和一些DLL模块,将有利于提高开发效率,同时有助于软件的升级。由于DLL是独立于主程序的,因此,向动态链接库增加新的函数或是增强现有函数的功能,只要原有函数的参数和返回值等属性保持不变,所有使用该DLL的原有应用程序都可以在升级后的DLL支持下运行,而不需要重新编译。
(3)实现细节隐藏,保护技术机密。(www.xing528.com)
因为DLL是二进制文件,以DLL形式发布的可重用模块保密性比较好,它能把开发者实现模块功能的宝贵技术隐藏起来。从另一方面讲,许多情况下用户并不关心模块内部的实现细节,他只是希望知道模块所提供的功能和使用方法。所以,为了技术保密和减轻用户负担,DLL是软件开发和使用的一个理想选择。DLL是语言无关的,在VC、VB或Delphi等支持DLL的任一个语言平台下开发的DLL都可以被其它支持DLL的语言所使用。
正是因为DLL具有上述三个优点,才使得动态链接库技术在Windows编程中的应用越来越广泛。Windows API函数中的相当一部分服务程序就是由一组DLL提供的。比如API的核心是三个DLL:KERNEL提供系统服务——内存管理、任务管理和动态链接等;GDI提供图形设备接口的服务——使用VGA、DRV之类的显示驱动程序以显示文本、图形等功能;USER提供用户接口服务——建立窗口界面、传递消息等。
当读者学习第八章的时候,就会了解到DLL是组件的支撑技术。组件以一种非常高明的方式来使用DLL,简单来说,DLL是这样的结构:在DLL中包含函数执行代码和一个表(如图3-2所示),当加载使用DLL时,可通过指针引出表,表中包含了函数的名字和函数的地址,要调用DLL的哪个函数,到表中进行查找并返回该函数地址,然后执行函数的代码。当然,这里给出的只是组件DLL的一个粗略的结构和简单描述,实际情况要比这里复杂的多。
动态链接库技术也有不足之处。最典型的就是应用程序在运行时必须有相应的DLL的支持。而且,使用DLL也增大了程序运行的开销,比如动态装载、函数调用、卸载等都需要系统进行处理,不过这种开销对大多数的应用程序的影响并不明显,只是在某些对运行速度要求特别苛刻的场合,才不得不考虑这一点。
图3-2 简化的组件DLL的结构示意图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。