技巧 |标签:delphibpl|举报|字号订阅 DELPHI 的 BPL 使用 了解
BPL 和 DLL 的关系将有助于我们更好地理解 DELPHI 在构件制作、运用和动态、静态编译的工作方式。对初学 DELPHI 但仍对
DELPHI 开发不甚清晰的朋友有一定帮助。
第一部分:有关包的介绍
一般我们编写编译一个 DELPHI 应用程序时,会产生一个 EXE 文件,也就是一个独立的 WINDOWS 应用程序。很重要的一点:
区别于 Visual Basic,DELPHI 产生的是预先包裹的应用程序是不需要大量的运行库(DLL's)。
假设:打开 Delphi 默认的工程(只有一个空白 form),F9 她将编译生成一个大约 295 KB (Delphi 5)的可执行文件。然后打开
Project | Options,把‘Build with runtime packages’选上再编译一下,EXE 文件大小就只有 15 KB 左右了。
我们编译一个 DELPHI 应用程序时默认地没有选择'Build with runtime packages',编译器将把程序运行所需要的代码直接写入你
的 EXE 文件中,因此产生的程序是一个相对独立的程序,并不需要任何附属的支持文件(例如动态运行库文件 DLL),这也就知道
了为什么 DELPHI 产生的应用程序为什么都那么大。
要建立尽可能小的 DELPHI 程序,方法之一就要充分发挥 Borland package libraries 的作用,简称 BPL。
先说什么是包?简而言之,一个包就是一个在 DELPHI 的 IDE 环境中被 DELPHI 应用程序共享的特殊的动态链接库。包允许我
们通过多级应用将我们的程序的一部分当做一个分离的模块供其他应用程序来共享。
包大致可分为运行期包(Run-time packages)和 设计期包(Design-time packages):
运行期包-当运行程序时提供 VCL 和库函数的支持,操作上很类似标准的动态链接库。
设计期包-用来在 DELPHI 的 IDE 环境安装控件和为控件建立特殊的属性编辑器。设计期包允许包含控件、属性和控件编辑器等
等,在 IDE 环境中,这类包是程序设计所必需的,也仅仅是 DELPHI 使用,并不和开发的应用程序一起分发。
知道这些包的运用,我们也就知道了运行期包是如何做处理和它们对 DELPHI 程序员有什么帮助了。
有一点必须说明:想很好地运用包并不要求你先成为一个成熟的控件编写者。DELPHI 编程初学者也可以和应该尝试去接触包的
概念,这将有利于你更好地理解包和 DELPHI 的工作关系。
第二部分:适时运用包裹和 DLL
一般都认为加入 WINDOWS 操作系统中的动态运行库是一种最有用最高效的应用。在 WINDOWS 系统中,很多应用程序同时运
行可能会引起了内存方面的问题,很多程序执行相似的操作任务,但各自又由不同的代码来控制并完成任务,动态运行库的作用就是
将你的执行程序中的这些代码放到一个系统共享环境下的 DLL 中去。可能最为直观的动态链接库例子就是 WINDOWS 操作系统自己
和它本身所带的 API 了。
动态链接库通常都是用来集合过程(procedure)和函数(function)以供程序调用。当然我们在编写动态链接库的同时,也可
以把一个 DELPHI FORM 放到一个 DLL 中去(例如一个 AboutBox FORM),此外我们也可以在 DLL 中存储程序所需要的资源
(resources)。更多关于 DELPHI 如何操作使用动态链接库,请参考相关书籍,不再赘述。
在比较 DLLs 和 BPLs 之前,我们先要知道可执行文件的 2 种代码链接的方式:静态链接和动态链接。
静态链接就是当一个 DELPHI 工程被编译的时候,工程所需要的所有代码将被直接链接入你的程序执行文件。结果就是执行文
件将包含程序所需要使用到的所有单元(units),你也许会说这样代码有点冗长,因为在通常默认情况下,一个 FORM 单元的 uses
子句列举了至少 5 个基本单元(如:Windows, Messages, SysUtils,...),尽管如此,DELPHI 还是能够智能地自动链接单元中真正要
用到的代码到工程代码中,从而尽可能地减少了执行文件的大小。使用静态链接,我们的应用程序就是一个相对独立的程序,不需要
任何额外的支持文件或动态链接库(暂时不考虑 BDE 和 ActiveX 构件)。DELPHI 中默认使用的就是静态链接方式。
动态链接就是应用程序将和标准的动态链接库(DLLs)一起运行。动态链接方式不需要将代码直接建立到每个应用程序中去,
单独为多个应用程序提供多线程的库函数支持,任何程序运行期间才需用到的包才将被加载,更值得一提的是:程序在动态方式需要
调用的包是自动加载的,因此你不需要专门写加载包的代码。
方法:简单地选中在 Project | Options 对话框中'Build with runtime packages'复选框后,再次编译你的程序,你的程序代码将自
动链接到动态运行包,而不是将引用单元都静态链接入你的工程执行文件。
是选择 BPL 还是 DLL?区别又在哪里?
你可能很奇怪为什么要选择使用运行期包,而不是 DLL,或者还有其他什么方法。
相对于 DLL 而言,包裹的概念是 DELPHI 开发中所特有的,就是说其他语言编写的应用程序不能引用 DELPHI 建立的包裹。即
使包是一种被 DELPHI 编写的应用程序所使用的动态链接库,它也同时提供给了 DELPHI 程序员更多的库函数支持。
通常我们在 DELPHI 中建立动态链接库(DLLs)是用来存储不同环境下应用程序所需要使用到的过程和函数,而包不仅能够包
含代码单元(untits)、构件和 FORMs,还能包含 DELPHI 中的类(classes)-这就使我们能够在其中引用对象向导编码(object
oriented code)。在包裹中,我们可以保存完整的通用 DELPHI 构件,而动态运行库(DLL's)对此则无能为力了。
此外,在缩减程序代码上,DLLs 和 BPLs 扮演着同样重要的角色,其主要原因就是在使用包裹或动态链接库技术后,都直接地
减少了程序的文件大小。当然,还要说明的是:执行程序需要加载的 DLLs 或 BPLs 也可能会是很庞大的。例如如果需要分发你的包
- 1
- 2
前往页