Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构 之二

Delphi 中 BPL(2):大型项目中 BPL 对性能的影响及调优策略 BPL(Borland Package Library)性能受多种因素影响,包括加载与卸载开销、内存问题、全局状态冲突和依赖链复杂度。加载和卸载BPL文件涉及操作系统的动态链接库管理机制,可能导致磁盘I/O和内存分配操作,尤其在大型项目中,初始化时间会显著增加。内存问题如泄漏和碎片化可能影响系统稳定性,而全局状态冲突和多级依赖链则增加了调试和优化的难度。为优化BPL性能,建议采用按需加载机制、模块化设计、内存管理优化、状态隔离技术以及监控与调试工具链。这些策略可以有效减少不必要的加载次数、合理规划功能边界、 阅读详情
在Delphi 中,将一个或多个类,编译为一个 BPL,让需要使用到这几个类的代码来调用,实际上在使用 DELPHI 的时候,我们就随时在应用这个功能 --- DELPHI IDE 里面安装的控件,就是让 IDE 动态加载控件的设计期 BPL。

这样的用法有一个问题:你要用到那个类的地方,必须【知道】那个类。也就是必须引用那个类的单元。尽管那个类你已经编译为了 BPL,但你的代码还是需要引用那个类的单元,也就是你需要那个类的 PAS 文件或者 DCU 文件。

一个好的程序架构,各类、各单元之间的耦合度,应该尽量低。并且,如果完成该功能的类增加了,比如新写一个相似功能的类编译为另一个BPL文件,那么,你的程序就需要增加对这个新的类的引用,你的程序必须修改源程序,重新编译。


因此,我们先针对上述问题,提出我们想要的:

1. 运行期动态加载一个BPL,使用BPL里面的类提供的功能;但不需要知道和引用这个BPL里面的类的单元和类的类型。

2. 增加新的相似功能的类,增加新的 BPL 文件,也只需要在运行期动态加载 BPL 的时候,换掉BPL文件就可以,程序不用重新编译,也不必引用新的类所在地单元。

要实现上述两点,可以采用基于接口的方式。首先单独定义一个接口单元。实现该接口的类,需要引用该单元;需要使用这个类提供的功能的程序,也引用该单元。但程序不需要引用类的单元,也不需要知道类的类型。当有新的类实现相似功能的时候,同样实现该接口。对于程序来说,因为都是调用相同的接口,具体是哪个类来实现这个接口程序不用关心,因此程序不需要做任何改动。 采用接口,降低了耦合度,同时提高了灵活性。

在上述前提下,首先把接口单元,放入一个单独的包(源代码情况下就是一个单独的 DPK 文件,编译后就是一个单独的 BPL 文件)。编译为BPL文件,同时DELPHI会输出一个 DCP 文件。

然后,再将实现该接口的一个类或多个类,放到一个 DPK 里面,因为这些类需要引用接口单元,而接口单元又编译为 BPL 文件,所以这个 DPK 需要引用(require)接口BPL对应的 DCP 文件。这样就可以编译出一个 BPL 文件。


而使用该接口的程序,设置为需要运行期包的编译方式,并填入接口单元所在BPL包文件的名字,就会让程序在运行启动时静态加载这个接口单元所在地 BPL 文件,如果文件不存在,则程序运行失败。

程序运行起来后,程序的代码可以通过动态加载一个包的方式,将实现接口的类所在的包加载进来。


问题来了:程序并不知道类的类型(没有引用类所在单元),如何根据需要创建该类的对象?没有对象实例,何来接口实例?

一个简单的办法:自己写一个简单的类工厂。这个类工厂本身,也编译为一个 BPL 包!也同样基于接口!

这样的架构,简单的描述就是:


1. 接口定义编译为 BPL 包,让程序静态加载;


2. 实现接口的类,编译为另一个 BPL 包,让程序动态加载;


3. 用类工厂来根据需要创建相应的类的实例,然后可以从该实例获得接口的实例。程序只需要调用接口里的方法、函数、属性等东西就可以了。创建的类不同,实现的功能可能就不同,但因为接口相同,对于使用接口的程序来说,就实现了传说中的【多态】的功能,只是这个多态不是基于类继承的方式,而是基于接口。

要让程序编译为运行时静态加载一个 BPL,而不是编译时直接把该 BPL 涉及到的 DCU 编译到程序的 EXE 里面去,需要在 DELPHI IDE 里面做如下设置:


Project -- Options -- Packages -- Build with runtime packages 选项打勾,然后在该选项下面的输入框里填上你的程序需要静态加载的 BPL 的名字。注意该输入框里已经默认把 DELPHI 提供的一堆 BPL 的名字都填在里面了。如果那些名字不去掉,则编译后的程序的 EXE 会非常小,但你发布程序的时候就必须带上一大堆 DELPHI 提供的 BPL。好处是,下次再发布程序,只要那台电脑里已经有那些BPL了,你就可以不用拷贝那么多的 BPL 给客户了,只需要给他一个很小的 EXE 文件就好了。


至于动态加载的 BPL,和动态加载 DLL 类似。
Delphi 中 BPL(1):基本概念、用途及使用方法 BPL 是 Binary Package Library 的缩写,表示二进制包文件。它是 Delphi 和 C++Builder 中用来存储运行时包的一种形式。这些包可以包含 VCL 或者自定义组件及其相关资源。 阅读详情

相关推荐

Delphi中BPL子窗体封装技术详解

在本章节中,我们将对BPL(Borland Package Library)进行定义,并分析它与DLL(Dynamic Link Library)之间的关键区别。BPL是一种在Delphi开发环境中广泛使用的技术,它允许开发者将一组相关的单元打包成一个单独的可执行模块。这种模块化的方法不仅提高了代码的组织性,还能够在多个项目中实现代码复用。BPL作为一种特殊的库文件,是通过Delphi编译器生成的,它封装了一系列的功能单元,使得这些功能可以在不同的Delphi项目中被共享。

weixin_33816734的博客 1260

Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构

DELPHI 的普通程序编译出来比较大,一个空程序也要超过1M。其原因是 DELPHI 的程序把所有需要的库都编译到EXE文件里面去了。这样做有个好处:程序发布简单,只要发布一个 EXE 就搞定。   不过,当程序写得很大,又是多人开发,并且程序不断升级,可能还有多个版本的时候,采用包编译方式就有好处了。程序主体 EXE 文件很小,方便升级;程序分成很多BPL包文件,升级某个功能,只需要更换B

缘起§缘灭 2574

Delphi动态调用BPL函数XE7

Delphi动态调用BPL函数 DelphiXE7 BPL

BPL窗体及类的封装方法

------------------BPL中的类封装PAS文件bplclass(类输出接口)-------------------- 方法二:在文件中定义BPL窗口pas中的类(接口) unit bplclass; interface uses bplUnit1;//引用BPL窗口PAS,即可输出其中的类 implementation end. 次方法有不利之处,也就是说主程序编程

电力软件设计[utemfo22] 1339

delphi 创建bpl和动态调用bpl示例源码

delphi 创建bpl和动态调用bpl示例源码,在Delphi 10 Seattle下创建和编译的。

Delphi的BPL动态加载窗体

Delphi的BPL动态加载窗体!

Delphi BPL包的运用

    一、关于包(package)     (一)编译EXE文件的两种模式     通常编译一个DELPHI应用程序时,生成一个EXE文件,也就是一个独立的WINDOWS应用程序。     这个EXE文件,它有两种编译方式。选择方式:     1、“Project | Options | Package "中,选择‘Build with runtime packages’即带包编译。     所...

lyhoo163的专栏 1万+

delphi BPL框架

1.通过继承父窗体,实现主程序调用模块窗体的方法或接口 2.splash通过Ini文件传递参数到主窗体 3.global中的uwinpulic集成了作者多年积累的函数,有兴趣的可以看看用用 4.动静态链接都用了,基础知识可以参照网上的其它贴子

delphi 10.4加载BPL问题

delphi 10.4调用BPL的时候,在用FindClass去找FORM的时候,一直提示找不到form,查资料说要勾选Build with runtime package,我找了半天没找到这个选项,后面测试在10.4里面 是Link with runtime package。如果你用到了bpl动态加载的,记得把这个勾选上。

daigua1987的博客 441

delphi exe+bpl+Dll框架(源代码和示例)

你的delphi程序还停留在一个EXE的时代嘛,你还要经常更新你的EXE嘛,用了这个架构以后,你要改哪部分,就只要修改哪个BPL或是DLL,不用更新EXE,是不是想试一下呢

多个DELPHI程序间的变量共享

多个DELPHI程序间的变量共享,单元文件中有详细的注释、供研究及使用。

Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构 之一

DELPHI 的普通程序编译出来比较大,一个空程序也要超过1M。其原因是 DELPHI 的程序把所有需要的库都编译到EXE文件里面去了。这样做有个好处:程序发布简单,只要发布一个 EXE 就搞定。   不过,当程序写得很大,又是多人开发,并且程序不断升级,可能还有多个版本的时候,采用包编译方式就有好处了。程序主体 EXE 文件很小,方便升级;程序分成很多BPL包文件,升级某个功

pcplayer的博客 3317

手把手教你解决CentOS sshd启动报错:从权限问题到目录缺失的全套解决方案

本文提供了一套完整的CentOS SSH服务启动故障排查与修复方案。针对sshd启动报错,从systemd日志分析、sshd -t配置测试入手,详细解决了私钥文件权限过宽(如0644错误)和权限分离目录缺失等典型问题,并附带了扩展排查清单,帮助运维人员系统性地定位和解决连接故障。

weixin_29248611的博客 152

BPL 和动态加载包

BPL 是一种特别的 DLL; 使用 Delphi 开发程序,可以把一个大程序的一部分,独立编译成一个 BPL,一个 Delphi 里面称作 Package 的东西,这里中文我们称作【包】,然后让 EXE 去加载它。 一个 EXE 加载 BPL 有两种模式:1. 静态加载;2. 动态加载; 关于静态加载: EXE 静态加载一个 BPL,如果 EXE 在启动的时候系统里面没有正确的 BPL 文件,EXE 会启动失败。 关于动态加载: 动态加载有很多好处。比如,BPL 文件不存在的时候,EXE 不会

pcplayer的博客 1791

基于MediaPipe的智能俯卧撑计数与姿势矫正系统

在现代健身和体能训练中,俯卧撑是最基础也是最有效的自重训练动作之一。然而,许多人在进行俯卧撑训练时常常存在姿势不正确、计数不准确等问题。本文将介绍如何利用计算机视觉和姿态估计技术,开发一个智能的俯卧撑计数与姿势矫正系统。

qq_36224726的博客 916

2025.06.24【R语言】|clusterProfiler安装与常见报错FAQ全解

本文介绍了clusterProfiler工具的安装方法及常见报错解决方案。安装可通过Bioconductor或Conda完成,需注意安装配套注释包。文中列举了10种常见报错,包括依赖包缺失、ID类型不匹配、物种不支持等问题,并给出具体解决方法。最后总结了GO/KEGG富集分析的标准流程,包括ID转换、富集分析和可视化步骤,为生物信息学分析提供实用参考。建议使用R≥4.2版本,并确保正确调用BiocManager进行安装。

5994

动态载入BPL包的完整过程及其他

1.出现A CLASS NAMED Already exists 错误如果你是动态载入BPL包,那有一原因是在呼叫BPL的程序已经USES了那个包中的类或模块;删除USES中的名字2.出现无法注册窗体在呼叫程式的component/install packages的build with runtime packages里面,把基类包含进去,在动态载入BPL中表单的时候,常常会出现这个问题;

NEWKINGLONG的专栏 2637

RK3568嵌入式Linux多屏显示开发指南

摘要:本篇RK3568嵌入式Linux多屏显示开发指南详细介绍了基于Qt应用层的实现方案。文章首先概述了技术架构,说明从Qt应用到硬件显示的完整流程。然后提供了两种实现方案:推荐使用Qt内置多屏支持方案,包含完整的C++代码示例和配置文件说明;对于需要精细控制的场景,给出了基于libdrm API的底层实现方案。最后重点讨论了屏幕旋转处理和多屏协同工作模式的关键技术要点,包括扩展桌面、镜像模式等实现方法。

froxy的专栏 1572

Delphi创建bpl和动态调用bpl示例源码:探索Delphi的强大功能

Delphi创建bpl和动态调用bpl示例源码:探索Delphi的强大功能 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在软件开发领域,Delphi语言的强大功能和灵活性使其成为众多开发者的首选。今天,我们要推荐的是一个开源项目——Delphi创建bpl和动态调用bpl示例源码。这个项目为广大开发者提供了一个简便的方式来创建和调用BPL(Binary Portabl...

gitblog_06739的博客 785

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一)

34. 默认格式是BNP format格式,会被Sigrity识别的S参数文件,在仿真完成后,默认会在文件夹中生成bnp和ckt(MCP)文件,无需这步操作。由于port设置的ref Z是50ohm,实际上电源网络的阻抗是没有这么高的,所以S参数回损曲线是基本上全反射的一个状态。Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线.42. Spice格式的加载进来图标是橙色的,BNP格式的图标是灰色的。

weixin_54787054的博客 1279

【WRF安装】WRF环境配置移植详细说明

【WRF安装】WRF环境配置移植详细说明

WW、forever的博客 819

delphi bpl与dll关系

原文链接:bpl与dll关系 第一部分:有关包的介绍 一般我们编写编译一个DELPHI应用程序时,会产生一个EXE文件,也就是一个独立的WINDOWS应用程序。很重要的一点:区别于Visual Basic,DELPHI产生的是预先包裹的应用程序是不需要大量的运行库(DLL's)。 假设:打开Delphi默认的工程(只有一个空白form),F9她将编译生成一个大约295 KB (Del

shuiyuanfengxing的专栏 2814

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

DELPHI XE2 BPL窗口调用主程序与BPL窗体参数传递:提升DELPHI程序交互体验

DELPHI XE2 BPL窗口调用主程序与BPL窗体参数传递:提升DELPHI程序交互体验 去发现同类优质开源项目:https://gitcode.com/ 在软件开发领域,DELPHI XE2环境下的BPL(Binary Program Library)窗口调用与参数传递一直是开发者关注的焦点。本文将详细介绍DELPHI XE2 BPL窗口调用的核心功能与场景,帮助开发者更好地理解和应用这一技...

gitblog_06746的博客 1038

ubuntu20.04中配置Pyrep和CoppeliaSim

在Ubuntu20.04中配置 Pyrep ,实现应用Python语言的机器人在 Vrep(CoppeliaSim)中的虚拟仿真。

加斯顿工程师的博客 3374

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构 之一
下一篇: DELPHI WEB SERVICE 多表提交的事务管理
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值