中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
重新编译 vcl70.bpl
作者:未知 时间:2005-07-27 22:02 出处:CSDN 责编:chinaitpower
              摘要:重新编译 vcl70.bpl

这是阿亮第一次写文章,有不正确的地方,欢迎讨论指正。

 

首先要更正一个错误的结论:只要程序用到Borland的包,就必须要带上VCLxx.bpl

 

非也!

 

想必用Dll来实现功能模块分割的伙计们都有痛苦经历:无法导出类;无法共享主进程的全局变量;调用Dll时可能要传递一大堆参数;令人心烦的PChar;等等等等...

Borland通过包Borland Package Library来解决了这些痛苦,在这里我们只讨论运行时包。

 

阿亮在2003年就因为工作原因研究了一下Delphi 5的包,并成功的将一个大的系统按功能模块分拆到单个运行时包文件中,当时就想把VCL50.bpl重新编译一下,没有成功,很不甘心!头段时间安装了Delphi 7,想重新试一下,结果居然成功了,也就是说,你可以写一个个头很小的exe文件(这对于有些程序员来说非常有吸引力,他们希望自己的的程序越小越好,甚至到了痴迷的程度,阿亮也算其中一员),可以多小呢?譬如20KBexe,这个主程序只是一个框架,它可能仅包含一个主窗休、初始化一些应用需要的全局结构或变量、实现动态装入和卸载包的代码,后面至少带一个被重新编译的VCL包,当然,这个VCL包可能包含所有的Delphi提供的标准单元,也可以仅包含你的应用需要的单元。

 

你可能发布的应用程序结构可能是以下结构:

 

App.exe           (* 主程序 *)

Borland.bpl       (* 被重新编译过的Borland VCL单元运行时包 *)

Common.bpl    (* 应用程序公用包, 所有的全局结构和单元定义和实现在此包中,主程序和模块包共同uses此包的的共用单元,以实现全局共享 *)

Module1.bpl       (* 模块一 *)

Module2.bpl       (* 模块二 *)

...

 

其中Borland.bplCommon.bpl是静态装入的,也就是说App.exeWindows装入时这两个文件必须在App.exe能够找到的路径中,典型的是在App.exe相同的文件夹或Windows System 文件夹中。

Module1.bplMoudle2.bpl...是需要动态装入的,这一点对于一个应用系统的扩展性非常非常重要!对于应用系统的的可定制性、控制应用的功能结构来说都是具有决定性的意义,理论上说只要你把主框架搭好了以后,模块是可以无限制添加的,你可以用以此框架为基础搭建一个进销存系统,同时它还可以是一个图形系统,或者是一个复杂的ERP系统,这一切都决定于你发布的模块包。

 

说了这么多,现在我们开始重新编译rtl70.bpl,这个包是所有VCL包的祖先(至少Delphi 7是这样),它包括一些重要的基础单元,如WindowsSysUtilsClasses等,且这个包是唯一一个不依赖其它运行时包的运行时包。

 

打开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 DiretoryDCP Output Directory文件夹都改在.

9、 编译它,出错时将VarHlprStrHlpr删除掉,阿亮目前还不知道此两单无是干嘛用的,删掉再说;

10、             编译成功,将在D:\生成Delphi.bplDelphi.dcp两个文件,其它的如VCLVCLXVCLDB等等运行时包的单元名也可以此法得到,添加到Delphi.dpk后面重新编译即可。

 

这样,发布应用时就不用带着VCL70.bplRTL70.bplVCLX.bpl等文件了,就一个Delphi.bpl就成了。

 

当然,凡事有利有弊:

 

1、 如果共用包(Common.bpl)被重新编译,则主程序和所有的模块包可能都需要重新编译,所以前期共用包和主程序框架的结构要尽可能考虑完整一些;

2、 如果你用到第三方控件,请选择那些有源码的控件,因为它们的运行时包也必须要重新编译,去掉RTLVCL等需要的包,换成Delphi.bcp,这应该也容易,阿亮就将Dxexpress的所有文件重新编译得到Express.bpl。我们很幸运!不是吗?在我们这个时代这些东东很容易找到,并且它们都写得很棒,为什么不用呢!

3、 你可能需要专门写个工具来维护包给你带来的模块版本问题;

4、 如果你有多应用个以动态包的形式发布,解决方法:其一,将Delphi.bpl安装到Windows System文件夹,让你的应用共享这个包;其二,为每个应用发布一个Delphi到应用的安装目录!?而这样将有背于M$的思想,这需要你选择。

 

 

liyl@founder.com

 


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有