Delphi中Bpl封装和动态加载.docx

上传人:scccc 文档编号:13536106 上传时间:2022-01-14 格式:DOCX 页数:4 大小:73.76KB
返回 下载 相关 举报
Delphi中Bpl封装和动态加载.docx_第1页
第1页 / 共4页
Delphi中Bpl封装和动态加载.docx_第2页
第2页 / 共4页
Delphi中Bpl封装和动态加载.docx_第3页
第3页 / 共4页
Delphi中Bpl封装和动态加载.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Delphi中Bpl封装和动态加载.docx》由会员分享,可在线阅读,更多相关《Delphi中Bpl封装和动态加载.docx(4页珍藏版)》请在三一文库上搜索。

1、Delphi中Bpl封装和动态加载基于接口,封装类为BPL包动态加载的 程序架构、架构及方案T扶初救債块曰烹14港SOCKETWI?#Hrrpttt?!捋察慣决升塚程学權块11认H决方梏 】、宦鼻课 2, B8H项】、播决划幼2-陣月更异方式itwI -旧 P*节罚章酣主程厚養秦博决JMS1_L/14 / 4、DLL群集Project Mariger, Object Inspector, Object TreeViewPrefect Manager object Inspector Object TreeView:Gp&Logrkdlg5 X Ne ove ActivateFilesE:GPS

2、_DLLE:GPLDLLLog4 EAGPS_DLLSqlite E:GPS_DLLSocket E:GPElDLLH 即 EAGPS_DLLMapK E:G PS_DLLMapBaidu E:GPS_DLLLoginPath-龍| GSP_DLL_ProiectGioupE 即 GpsLog4.dlE 即 GpsSqlite.dllEl 卽 GpsSockeLdl 匡 j Gps .dll 訝劭 GpsMapt.dll + jJI GpsMapBeidudl + R GpfLogin.dll三、程序结构Project Manager, Object Inspector, Object Tre

3、eViev;Project Manager Objed Inspector |Object Tree View |営XQNew Remove ActivateGNSS.exe二|FilesI Path-GNSSProjeclGtoup + 即 GNSS.eie + 0 Main, bpl +Reportbpl+ 0 Alarm, bpl + 金 Photo.bpl e $EAGPS_GNSSE:GPS_GNSS E:GPS_GNSSMain E:GPS_GNSSSReport E:GPS_GNSSAlarm E:GPS_GNSSPhoto EAGPS_GNSSCommon四、规那么考前须知1、

4、公共包:EXE及各 BPL 均 build with.2、内存共享:ShareMem单元放在引用第一个.3、基类:分为两种,一种为窗口,一种为类.窗口有两个,一个模式窗口,一个非模式窗口.所有窗口必须从基类继承. 类也有两个,一个普通类,一个治理类列表.所有类必须从基类继承.五、原理在Delphi中,将一个或多个类,编译为一个BPL,让需要使用到这几个类的代码来调用,实际上在使用 DELPHI的时候,我们就随时在应用这个功能-DELPHI IDE里面安装的控件,就是让IDE动态加载控件的设计期BPL这样的用法有一个问题:你要用到那个类的地方,必须【知道】那个类.也就是必须引用那个类的单元.尽管

5、那个类你已经编译为了BPL,但你的代码还是需要引用那个类的单元,也就是你需要那个类的PAS文件或者 DCU文件.一个好的程序架构,各类、各单元之间的耦合度,应该尽量低.并且,如果完成该功能的类增加了,比方新写一个相似功能的类编译为另一个BPL文件,那么,你的程序就需要增加对这个新的类的引用,你的程序必须修改源程序,重新编译.因此,我们先针对上述问题,提出我们想要的:1. 运行期动态加载一个 BPL,使用BPL里面的类提供的功能;但不需要知道和引用这个BPL 里面的类的单元和类的类型.2增加新的相似功能的类,增加新的BPL文件,也只需要在运行期动态加载BPL的时候,换掉BPL文件就可以,程序不用

6、重新编译,也不必引用新的类所在地单元.要实现上述两点,可以采用基于接口的方式. 首先单独定义一个接口单元. 实现该接口的类, 需要引用该单元;需要使用这个类提供的功能的程序,也引用该单元.但程序不需要引用类的单元,也不需要知道类的类型.当有新的类实现相似功能的时候,同样实现该接口.对于程序来说,由于都是调用相同的接口,具体是哪个类来实现这个接口程序不用关心,因此程序不需要做任何改动.采用接口,降低了耦合度,同时提升了灵活性.在上述前提下,首先把接口单元,放入一个单独的包源代码情况下就是一个单独的 DPK文 件,编译后就是一个单独的 BPL文件.编译为BPL文件,同时DELPHI会输出一个 DC

7、P文 件.然后,再将实现该接口的一个类或多个类,放到一个DPK里面,由于这些类需要引用接口单元,而接口单元又编译为BPL文件,所以这个 DPK需要引用require接口 BPL对应的DCP文件.这样就可以编译出一个BPL文件.而使用该接口的程序, 设置为需要运行期包的编译方式, 并填入接口单元所在 BPL包文件的 名字,就会让程序在运行启动时静态加载这个接口单元所在地 BPL文件,如果文件不存在, 那么程序运行失败.程序运行起来后,程序的代码可以通过动态加载一个包的方式,将实现接口的类所在的包加载进来.问题来了:程序并不知道类的类型 没有引用类所在单元,如何根据需要创立该类的对象? 没有对象实

8、例,何来接口实例?一个简单的方法:自己写一个简单的类工厂.这个类工厂本身,也编译为一个BPL包!也同样基于接口!这样的架构,简单的描述就是:1. 接口定义编译为 BPL包,让程序静态加载;2. 实现接口的类,编译为另一个BPL包,让程序动态加载;3. 用类工厂来根据需要创立相应的类的实例,然后可以从该实例获得接口的实例.程序只需要调用接口里的方法、函数、属性等东西就可以了.创立的类不同,实现的功能可能就不同,但由于接口相同,对于使用接口的程序来说,就实现了传说中的【多态】的功能,只是 这个多态不是基于类继承的方式,而是基于接口.要让程序编译为运行时静态加载一个BPL,而不是编译时直接把该BPL

9、涉及到的DCU编译到程序的 EXE里面去,需要在 DELPHI IDE里面做如下设置:Project - Opti ons - Packages - Build with run time packages 选项打勾,然后在该选项下面的输 入框里填上你的程序需要静态加载的BPL的名字.注意该输入框里已经默认把DELPHI提供的一堆BPL的名字都填在里面了. 如果那些名字不去掉,那么编译后的程序的EXE会非常小,但你发布程序的时候就必须带上一大堆DELPHI提供的BPL.好处是,下次再发布程序,只要那台电脑里已经有那些BPL 了,你就可以不用拷贝那么多的BPL给客户了,只需要给他一个很小的 EXE文件就好了.至于动态加载的 BPL,和动态加载 DLL类似.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1