Delphi BPL包的运用

    一、关于包(package)
    (一)编译EXE文件的两种模式
    通常编译一个DELPHI应用程序时,生成一个EXE文件,也就是一个独立的WINDOWS应用程序。
    这个EXE文件,它有两种编译方式。选择方式:
    1、“Project | Options | Package "中,选择‘Build with runtime packages’即带包编译。
    所谓的“带包编译”,即“动态链接”,它需要运行一环境必须向EXE提供标准的动态链接库(BPL文件)。
    因此,动态链接方式不需要将(BPL)代码直接编译进EXE文件中去,运行时,通过运行加载(BPL包)。此时生成的EXE文件,比较小。
    2、“Project | Options | Package "中,取消‘Build with runtime packages’,就是非带包编译。
    所谓的“非带包编译”,就是通常说的“静态链接”就是当一个DELPHI工程被编译的时候,工程所需要的所有代码将被直接链接入你的程序执行文件。结果就是执行文件将包含程序所需要使用到的所有单元(units)。编译的结果:一是编译器将把程序运行所需要的代码直接写入你的EXE文件中,因此产生的程序可以独立运行,二是文件太大,它将全部的基本单元编译进EXE文件中,它不需要任何附属的支持文件(动态运行库BPL文件)
  (二)BPL包文件 
    所谓“包”,就是DELPHI的IDE环境中,被DELPHI应用程序共享的特殊的动态链接库。包允许我们通过多级应用将我们的程序的一部分当做一个分离的模块供其他应用程序来共享。 包大致可分为设计期包和运行期包二种。
    1、设计期包(Design-time packages)
    设计期包用来在DELPHI的IDE环境安装控件和为控件建立特殊的属性编辑器。设计期包允许包含控件、属性和控件编辑器等等,在IDE环境中,这类包是程序设计时所必需的。它
    (1)Delphi自带的设计包
     比如Delphi7的dclact70.bpl文件,它在Delphi\bin目录中,它包含的控件:TStandardColorMap、TTwilightColorMap、TXPColorMap、TActionToolBar、TActionManager、TActionMainMenuBar、TCustomizeDlg。
    (2)第三方提供的设计包
    (3)用户自行开发的设计包
    2、运行期包(Run-time packages)
    运行期包用在运行程序时,提供VCL和库函数的支持,操作上很类似标准的动态链接库。
    (1)封闭的类对象模块
    (2)封装的运行库(函数和过程)
    (3)封装Form窗体
    需要说明的是,采用带包编译,在EXE文件发布时,设计期包和运行期包都要一并发布。
  二、BPL包与DLL
    (一)DLL的核心
    DLL是WINDOWS操作系统中的动态运行库,在WINDOWS系统中,很多应用程序同时运行可能会引起了内存方面的问题,很多程序执行相似的操作任务,但各自又由不同的代码来控制并完成任务,动态运行库的作用就是将你的执行程序中的这些代码放到一个系统共享环境下的DLL中去。可能最为直观的动态链接库例子就是WINDOWS操作系统自己和它本身所带的API了。
    动态链接库通常都是用来集合过程(procedure)和函数(function)以供程序调用。它也能封装对象(Form)。
  (二)二者的异同
    1、DLL是运行期的运行库,BPL也完全担当起DLL动态链接库的功能。
    2、Dll是windows的标准运行库文件,它可以向wimdows操作系统下,运行的由其它语言编译的主程序EXE提供支持(调用)。即Delphi编译的DLL,也可以向C语言的程序提供支持使用。而BPL是Delphi的独特,只能提供缎带Delphi自身使用。
    3、BPL运行包运行时,是与主程序EXE同一线程,可以共享全局变量和类、对象(控件)。而DLL它运行时,Windows为它的线程,所以它与调用它的主程序EXE,不能共享全局变量和类、对象(控件)。
    4、在压缩程序代码上,DLL和BPL扮演着同样重要的角色,使用二者直接地减少了EXE文件尺寸。
    因此,动态运行库(DLL)是用来存储不同环境下应用程序所需要使用到的过程和函数。包不仅能够存储不同环境下应用程序所需要使用到的过程和函数,同时它包含代码单元(untits)、构件和窗体(FORM),还能包含DELPHI中的类(classes),提供引用对象向导编码(object oriented code)发挥重要功能作用。
    这此功能动态运行库(DLL)对此则无能为力了。
    三、通过BPL实现插件框架方式开发
    (一)软件结构

   1、 建立软件体系的工程组,由主程序(通常是EXE程序),与各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。

    2、让各自的模块,如主程序,插件(DLL或BPL),建立独立的工程(件)。

   优点:合起来就是一个系统,分开来,也是独立的工程。方便整个工程的分组开发。

    (二) 编译,主程序和各插件工程时,全部采用“BUILD WITH RUNTIME PACKAGE”方式。
    四、建立和使用运行期包
    (一)建立一个新的运行期包
    1.启动DELPHI,并选择File | Close All关闭默认的工程。
    2.选择File | New...,在"New items"对话框中的"new"页面中双击Package图标,就会出现包裹编辑器。包裹编辑器包含2个文件夹:Contains和Requires。
    3、选择Contains文件夹,点击Add按钮,可以增加一个单元文件(构件或是一个简单的代码单元文件)。注意:你添加的是PAS源码文件而不是编译后的DCU文件。当你添加单元文件的同时,包中的单元的名字就显示在包裹编辑器的Contains文件夹中了。
    4.选择Requires文件夹,展开的列表表示包裹所需要的包的DCP文件,包裹文件最基本的就需要引用含有绝大部分标准可视控件的vcl70.dcp文件。
    5.当你添加完单元文件,单击Options按钮,在Description面板中的Usage options组中你需要选择包裹种类:
    (1)Description only(仅设计期包)。
    (2)Runtime only(仅运行期包),其他包的使用者将无法将图示2个构件安装到IDE环境中去。
    (3)Description and Runtime 设计期包和运行期包。
    6.使用File | Save保存包工程文件(DPK),然后保存包文件,如MyVCL22,包裹文件的命名将很重要。
    7.在包裹器中,单击Compile按钮来编译包。
    8.如果不出什么意外,编译包后将建立一个包裹文件(BPL文件),期间你可能还要确定你必须增加的其他包裹(例如MyVCL01),这些包都将在Requires文件夹中列出。
    9.完成,Borland package library文件已经成功建立,就等着使用了。
    在包裹编辑器中有一个Install按钮,就是用来将当前包裹安装成一个设计期包的。如果包裹是run-time only(仅运行期包),那Install按钮将无法使用。
    (二)相关文件
    1、单元源码文件
    2、DPK文件,是包的源文件。
    3、BPL文件,是生成的包文件。注意:生成的*.BPL文件,$(DELPHI)\Projects\Bpl目录中。 
    4、DCP文件,是包中所包含单元文件的编译文件(DCU)的标识信息的集合。
    五、使用运行期包设计程序
    开始使用动态链接编写应用程序时,不需要写代码去加载运行期包裹,只需要在Project | Options中做相关设置,选择在Packages页的Runtime Packages编辑框中的包裹列表,编译程序时将自动链接。应用程序要使用到一个运行期包时,使用ADD按钮来增加包裹文件。
    注意:尽管一个应用程序被链接到运行期包,程序的USES子句所列出的单元文件也必须都是存在的,编译运行期包裹只是告诉应用程序哪里可以找到构件代码而已。
    六、程序发布
    (一)需发布那些BPL文件
     在IDE中编译运行程序后,打开菜单“project-information for ”。你可以看到当前项目所使用的所有的包的名字。
    (二)编译生成的包文件存在哪
    1、系统盘的 windows\system32 目录。
    2、Delphi默认的包的安装路径:$(DELPHI)\Projects\Bpl 目录。
    3、$(DELPHI)\Bin 目录。
    4、安装第三方的组件的目录。
    (三)包文件发布的目录
    1、系统盘的 windows\system32 目录。
    2、与EXE文件相同目录。

    特别提示:本人在开发的过程中,发现使用Dll封装Form中,带有数据库读写的控件(如DBGrid)。在嵌入到TabSheet中,出现焦点问题,一时不好解决。特别影响用户的体验,如果使用BPL作为封装Form,就不存在此类问题。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值