Bpl的使用以及与Dll的区别

Bpl就是Dll,这句话当然没错。
  简单的例子,当然可以做,而且可以做得很好,我就曾把左兄的离线浏览器改成了这样一
个版本: 实现多个数据连接方式,ADO、DOA、ODAC、IBX、KAO,每个连接对应它的特定数据
库,都以一个独立的BPL来实现;主程序没有任何连接数据库的代码,主窗体切换版本时只要
这样一段代码就行了:

 

 

 

编译成一个BPL就OK了。
这样用BPL做起来真的是非常简便,只要用LoadPackage以后,各单元就跟你直接uses差不多
了,initialization及finalization也会帮你执行,然后你就当做不存在BPL这回事一样用
就OK了。 这是BPL的好处,可以很方便的划分现有的代码成相对独立的模块。

但是,它也有几个致命的缺点,首先它无法象DLL一样,把它引用到的某一个或某几个BPL里的内
容编译进去,也就是说,只要你这个BPL引用了另一个BPL,发布的时候就必须两个BPL一起发
布,另外,只要一个BPL引用了某一个单元,其他的BPL就不能直接引用那个单元编译,而必须
引用一个公用的包含此单元的BPL,否则你这两个BPL是无法同时Load的。有了这两点,对于
大型项目来说,做起来是非常复杂的,各个模块之间的关系很难处理好,不象DLL,编译出
来后,各成各的体系,不会说因为这个DLL引用了这个单元,另一个DLL必须通过其他引用了
此单元的DLL来引用那个单元。

 Delphi中Package是一件非常强大的工具,用的好可以起到非常清晰的
划分程序结构的作用。因为他内建描述信息,可以和当前代码无缝集成起来,
可以保护包括类在内的任何元素,相当于VC中的MFC Extension DLL的作用。
但是一直以来的文章都只介绍静态连接的方法,这其实限制了Package的使用
因为静态连接的Package失去了其灵活性,可配置性等等。至于通过函数入口
方式访问,实在是大材小用,那不如直接用DLL还方便一些。
   如何动态载入Package,使用其中的类、函数、变量等等?起始说穿了很
简单,就是做一个代理包。因为在一个Delphi程序中,每个unit只能存在
一份,否则发生冲突。要动态载入包,又得取得其中信息,又不能直接uses
包含信息的unit(否则引起冲突),解决办法是另外建一个代理包来作为桥梁
传递信息。下面是一个简单的例子,主程序使用到两个包,DemoPak包中有
一个简单的Form;RegPak是所谓的代理包,起到注册信息的作用。
主程序对RegPak静态使用(在Project Options里面设置了),对DemoPak
动态载入(通过LoadPackage),而DemoPak依赖于RegPak(requires),
并在初始化时向代理包RegPak注册自己的可用类,这里举例注册类信息,
你可以方便的改成注册其他信息

 

 

   以上是RegPak的主要代码,因为举例,代码很简陋。主要思想就是保存注册信息,
提供查询方法。让我们看看在DemoPak中的使用

 

 

   在初始化时向RegPak的FormReg单元提交自己的类信息,因为每个Package在载入时
无论动态静态都会自动初始化,而RegPak被主程序静态引用,肯定已经初始化,所以直接
注册即可,非常简单。最后看看主程序中的使用

 

 

 

    动态载入需要的包,查询需要的类的信息,使用之,最后卸载包。

象dll样输出 我已试成功了,而且是在mdi中试成功的。
贴出代码,大家同喜。希望bbkxjy来拿分。
主要的原因是bpl输出的目录默认为/bpl下。
而我一直没有在意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值