这是阿亮第一次写文章,有不正确的地方,欢迎讨论指正。
首先要更正一个错误的结论:只要程序用到Borland的包,就必须要带上VCLxx.bpl。
非也!
想必用Dll来实现功能模块分割的伙计们都有痛苦经历:无法导出类;无法共享主进程的全局变量;调用Dll时可能要传递一大堆参数;令人心烦的PChar;等等等等...
Borland通过包Borland Package Library来解决了这些痛苦,在这里我们只讨论运行时包。
阿亮在2003年就因为工作原因研究了一下Delphi 5的包,并成功的将一个大的系统按功能模块分拆到单个运行时包文件中,当时就想把VCL50.bpl重新编译一下,没有成功,很不甘心!头段时间安装了Delphi 7,想重新试一下,结果居然成功了,也就是说,你可以写一个个头很小的exe文件(这对于有些程序员来说非常有吸引力,他们希望自己的的程序越小越好,甚至到了痴迷的程度,阿亮也算其中一员),可以多小呢?譬如20KB的exe,这个主程序只是一个框架,它可能仅包含一个主窗休、初始化一些应用需要的全局结构或变量、实现动态装入和卸载包的代码,后面至少带一个被重新编译的VCL包,当然,这个VCL包可能包含所有的Delphi提供的标准单元,也可以仅包含你的应用需要的单元。
你可能发布的应用程序结构可能是以下结构:
App.exe (* 主程序 *)
Borland.bpl (* 被重新编译过的Borland VCL单元运行时包 *)
Common.bpl (* 应用程序公用包, 所有的全局结构和单元定义和实现在此包中,主程序和模块包共同uses此包的的共用单元,以实现全局共享 *)
Module1.bpl (* 模块一 *)
Module2.bpl (* 模块二 *)
...
其中Borland.bpl和Common.bpl是静态装入的,也就是说App.exe被Windows装入时这两个文件必须在App.exe能够找到的路径中,典型的是在App.exe相同的文件夹或Windows System 文件夹中。
而Module1.bpl、Moudle2.bpl...是需要动态装入的,这一点对于一个应用系统的扩展性非常非常重要!对于应用系统的的可定制性、控制应用的功能结构来说都是具有决定性的意义,理论上说只要你把主框架搭好了以后,模块是可以无限制添加的,你可以用以此框架为基础搭建一个进销存系统,同时它还可以是一个图形系统,或者是一个复杂的ERP系统,这一切都决定于你发布的模块包。
说了这么多,现在我们开始重新编译rtl70.bpl,这个包是所有VCL包的祖先(至少Delphi 7是这样),它包括一些重要的基础单元,如Windows、SysUtils、Classes等,且这个包是唯一一个不依赖其它运行时包的运行时包。
打开Delphi 7
1、 关掉Delphi 创建的默认工程(如果有的话);
2、 File->New->Other,选择Package;
3、 New 一个Form,编译一次;
4、 再切换窗口回到Package – Pacakge1.dpk;
5、 双击Requires节点下的rtl.dcp,将得到rtl.dpk;
6、 按F12切换到rtl.dpk源代码,将其另存如d:\delphi.dpk;
7、 Close All;
8、 Open d:\delphi.dpk,将Options中的Output Diretory及DCP Output Directory文件夹都改在.;
9、 编译它,出错时将VarHlpr、StrHlpr删除掉,阿亮目前还不知道此两单无是干嘛用的,删掉再说;
10、 编译成功,将在D:\生成Delphi.bpl和Delphi.dcp两个文件,其它的如VCL、VCLX、VCLDB等等运行时包的单元名也可以此法得到,添加到Delphi.dpk后面重新编译即可。
这样,发布应用时就不用带着VCL70.bpl、RTL70.bpl、VCLX.bpl等文件了,就一个Delphi.bpl就成了。
当然,凡事有利有弊:
1、 如果共用包(Common.bpl)被重新编译,则主程序和所有的模块包可能都需要重新编译,所以前期共用包和主程序框架的结构要尽可能考虑完整一些;
2、 如果你用到第三方控件,请选择那些有源码的控件,因为它们的运行时包也必须要重新编译,去掉RTL、VCL等需要的包,换成Delphi.bcp,这应该也容易,阿亮就将Dxexpress的所有文件重新编译得到Express.bpl。我们很幸运!不是吗?在我们这个时代这些东东很容易找到,并且它们都写得很棒,为什么不用呢!
3、 你可能需要专门写个工具来维护包给你带来的模块版本问题;
4、 如果你有多应用个以动态包的形式发布,解决方法:其一,将Delphi.bpl安装到Windows System文件夹,让你的应用共享这个包;其二,为每个应用发布一个Delphi到应用的安装目录!?而这样将有背于M$的思想,这需要你选择。