Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系

Delphi XE10.3静态DLL编写与调用实践指南 定义接口的第一步是创建一个接口类型,它定义了要实现的方法集。这些方法是抽象的,只有声明没有实现。在Delphi中,通常使用interface关键字来定义接口。interface['{GUID}'] // 为接口定义一个全局唯一标识符// 接口方法声明end;接口规范的定义是实现步骤的基础,它为后续实现类提供了明确的指导。 阅读详情
 一、Delphi中各种文件的介绍,及其关系。

OXC: ActiveX控件。会被安装到某一个组件包DPK中,在Imports中会创建PAS、DCU、DCR三个文件。

DLL: 动态链接库文件,它的Exports exports既可以写在工程文件里面,也可以写在Unit里面,没有区别。

DPK: 组件包文件,它是由多个组件(PAS)集合而成的。

BPL: 包裹文件,其实就是DLL文件,只是在DLL的基础上添加了一些特性:比如检查重复Unit之类。它是Delphi IDE集成开发环境需要的,是DPK编译产生的文件。其中Run-Time类型供运行用的EXE使用,Design-Time类型供Delphi使用。不同的版本格式不一样。它可以像DLL一样写Exports。

DCU: 编译文件,是PAS编译产生的(相当OBJ文件),连接器能使用 DCU ,将代码连接入目标输出文件中。每个Delphi的版本生成的dcu格式都不一样。

 

二、包的设计思想

                  一个包就是一个在Delphi的IDE环境中被应用程序共享的特殊的动态链接库。包允许我们通过多级应用将我们的程序的一部分当做一个分离的模块供其他应用程序来共享。因为编译之后的DPL是一种特殊的DLL,所以可在属于某个DPK的Unit里面写export语句,

 

1、静态链接和动态链接。

                  静态链接就是当一个Delphi工程被编译的时候,工程所需要的所有代码将被直接链接入你的程序执行文件。结果就是执行文件将包含程序所需要使用到的所有单元(units),你也许会说这样代码有点冗长,因为在通常默认情况下,一个Form单元的uses子句列举了至少5个基本单元(如:Windows, Messages, SysUtils等),尽管如此,Delphi还是能够智能地自动链接单元中真正要用到的代码到工程代码中,从而尽可能地减少了执行文件的大小。使用静态链接,我们的应用程序就是一个相对独立的程序,不需要任何额外的支持文件或动态链接库(暂时不考虑BDE和ActiveX构件)。DELPHI中默认使用的就是静态链接方式。

                  动态链接就是应用程序将和标准的动态链接库(DLL)一起运行。动态链接方式不需要将代码直接建立到每个应用程序中去,单独为多个应用程序提供多线程的库函数支持,任何程序运行期间才需用到的包才将被加载,更值得一提的是:程序在动态方式需要调用的包是自动加载的,因此你不需要专门写加载包的代码。设置方法是:选中在【Project】->【Options】->【Packages】,选中【Build With Runtime Packages】复选框后,再次编译程序,你的程序代码将自动链接到动态运行包,而不是将引用单元都静态链接入你的工程执行文件。 如果有了【Build With Runtime Packages】,那么在编译的时候,那么它是不需要什么DCU/PAS。

例如:

                  打开Delphi默认的工程(只有一个空白form),F9它将编译生成一个大约365 KB (Delphi7)的可执行文件。然后打开【Project】->【Options】->【Packages】,把【Build With Runtime Packages】选上再编译一下,EXE文件大小就只有17 KB左右了。

                  我们编译一个Delphi应用程序时默认地没有选择【Build With Runtime Packages】,编译器将把程序运行所需要的代码直接写入你的EXE文件中,因此产生的程序是一个相对独立的程序,并不需要任何附属的支持文件(例如动态运行库文件DLL),这也就知道了为什么DELPHI产生的应用程序为什么都那么大。要建立尽可能小的Delphi程序,方法之一就要充分发挥Borland Package Libraries的作用,简称BPL。

 

2、包的分类:

大致可分为运行期包(Run-time Packages)和设计期包(Design-time Packages):

运行期包: 当运行程序时提供VCL和库函数的支持,操作上很类似标准的动态链接库。

设计期包: 用来在Delphi的IDE环境安装控件和为控件建立特殊的属性编辑器。设计期包允许包含控件、属性和控件编辑器等等,在IDE环境中,这类包是程序设计所必需的,也仅仅是Delphi使用,并不和开发的应用程序一起分发。

 

3、运行期包和设计期包分开的必要性和好处:

                  设计时的代码在运行时不会被执行,而编译器并不能知道,把所有的代码都链接进去,因此分开设计可以防止代码膨胀。一个运行期包,一个设计期包,使应用程序的体积变小,避免所有关的单元全部链接到执行程序中去(Delphi5及前版本),使代码膨胀。

                  还有一个好处就是减少编译错误的发生,Delphi6版本以来,VCl结构对Delphi5及前版本有所调整,Borland用DesignIntf替换了DsgnIntf,而且属性编辑器也被放进DesignEditors、DesignMenus、DesignWindows和其它的一些设计文件里。特别是DesignEditors使用了其它的一个名叫Proxies的IDE文件。而Proxies被编译进了DesignIDE.bpl文件中。DesignIDE.bpl已经不再是一个可以分发的文件,我们只能在开发环境中使用,不用说,这时候编译应用程序时就出现“找不到文件”的问题了。这时,我们将运行期包和设计期包分开,将设计期包加入Designide.dcp文件,分别编译包文件,就能保证正确无误,编译通过!

                  Package组件包它类似于Dll,不过只是在Delphi和CBuilder环境中通用。很好的利用包,可以使程序模块清晰,能最大限度的代码重用,使程序的体积尽量减小,而且可以在这两种语言环境中互用。

 

4、为了使代码结构最优化,设计期包应该包括:

1>、所有的注册声明(最好放在一个单独的单元中);

2>、所有的属性编辑器;

3>、所有的组件编辑器;

4>、将需要DesignIDE支持的包(Designide.dcp文件,在Requires写:DesignIDE)。

注意: 组件编辑器是通过在组件上弹出快捷菜单,象Table等组件。它的制作比较类似,是从TComponentEditor下继承来的。

 

5、为了使代码结构最优化,运行期包应该包括:

1>、组件本身。

2>、组件可能在运行时调用的窗体(属性编辑器用到的)。

注意: Package根据版本不同而进行不同的设计,Delphi 6.0的编辑器版本是VER140,Delphi 5.0的编辑器版本是VER130,如果我们想适应不同的版本需要使用 {$IFDEF VER140}。。。{$ELSE}。。。{$ENDIF};在Uses域进行控制,这点大家稍加注意。

 

三、适时运用包裹BPL和DLL

                  一般都认为加入Windows操作系统中的动态运行库是一种最有用最高效的应用。因为在Windows系统中,很多应用程序同时运行可能会引起了内存方面的问题,而很多程序执行相似的操作任务,但各自又由不同的代码来控制并完成。动态运行库的作用就是将你的执行程序中的这些代码放到一个系统共享环境下的DLL中去。可能最为直观的动态链接库例子就是Windows操作系统自己和它本身所带的API了。

                  动态链接库通常都是用来集合过程(procedure)和函数(function)以供程序调用。当然我们在编写动态链接库的同时,也可以把一个Delphi Form放到一个DLL中去(例如一个AboutBox Form),此外我们也可以在DLL中存储程序所需要的资源(resources)。

                  相对于DLL而言,包裹的概念是Delphi开发中所特有的,其他语言编写的应用程序不能引用Delphi建立的包裹。包是Delphi编写的应用程序能使用的一种动态链接库,它也同时给了Delphi程序员更多的库函数支持。

                  通常我们在Delphi中建立动态链接库(DLL)是用来存储不同环境下应用程序所需要使用到的过程和函数,而包不仅能够包含代码单元(unit)、构件和窗体(Form),还能包含Delphi中的类(如classes,这样的话,我们就能在其中引用对象向导编码(Object Oriented Code)。在包裹中,我们可以保存完整的通用Delphi构件,而动态运行库(DLL)对此则无能为力了。 
                  此外,在缩减程序代码上,DLL和BPL扮演着同样重要的角色,其主要原因就是在使用包裹或动态链接库技术后,都直接地减少了程序的文件大小。当然,执行程序需要加载的DLL或BPL也可能会是很庞大的。尽管如此,如果你要分发共享同个包的多个应用程序,就可以省很多事了。当用户方系统中已经存在程序运行需要的部分文件(如:标准的Delphi Bpl)后,就只需要下载程序的最小执行文件了。如果程序工程主要是通过Internet等方式分发和开展,那效率显然有很大的提高。 
                  包的应用也节省系统内存,因为动态链接的结果就是:只有一个VCL被读入内存供所有使用运行期包的Delphi应用程序使用。

 

四、建立包的基本步骤:

1、 启动DELPHI,并选择【File】->【Close All】关闭默认的工程。

2、 选择【File】->【New..】,弹出New Items对话框;然后【New】->【Package】,双击就会出现包裹编辑器。包裹编辑器包含2个文件夹:Contains和Requires。

3、 点击【Add】就可以增加一个单元文件(构件或是一个简单的代码单元文件)。

(注意:你添加的是PAS源码文件而不是编译后的DCU文件。当你添加单元文件的同时,包中的单元的名字就显示在包裹编辑器的Contains文件夹中了。打开Requires文件夹,展开的列表表示包裹所需要的包的DCP文件,包裹文件最基本的就是需要引用含有绝大部分标准可视控件的vcl.dcp文件。也可以看到必

须增加的其他包裹)

4、  然后单击【Options】,在【Description】面板中的【Usage Options】组中你需要选择包裹种类。

(设计期包、运行期包、或者两者都是。如果选择Runtime  only(仅运行期包),其他包的使用者将无

法将构件安装到IDE环境中去)

5、  使用【File】->【Save】保存包工程文件(DPK),然后保存包文件,如AboutDP70。

6、  在包裹编辑器中,单击Compile按钮来编译包。如果不出错误,编译包后将建立一个包裹文件(BPL文件)。

7、  完成,BPL文件已经成功建立,就等着使用了。

8、  在包裹编辑器中有一个Install按钮,就是用来将当前包裹安装成一个设计期包的。如果包裹是

         run-time   only(仅运行期包),那Install按钮将无法使用。

 

                  关于所建立的这些文件除了DPK文件和那些单元源码文件,DELPHI还使用包裹的动态链接版本产生一个BPL文件和一个含有包内标识信息DCP文件,DCP文件就是包中所包含单元文件的编译文件(DCU)的标识信息的集合。

delphi exe+bpl+Dll框架(源代码和示例) 你的delphi程序还停留在一个EXE的时代嘛,你还要经常更新你的EXE嘛,用了这个架构以后,你要改哪部分,就只要修改哪个BPL或是DLL,不用更新EXE,是不是想试一下呢 立即下载

相关推荐

Delphi dcu文件 反编译工具

Delphi dcu文件 反编译工具 Decompile dcu file to pas support Delphi2~Delphi7

Delphi IDE扩展开发向导

作者:Borland(由CnPack翻译)来源:www.CnPack.org 以后文章中没有写我的开场白:技术交流,DH讲解 的都是转载的,知道作者名字的,我会写出来,不知道也没有办法了.但是好文章还要拿出来和大家分享的. 一、 概 述 1、 前言 Delphi的IDE扩展是一般程序员很少涉足的领域,不管是网上还是书店里,这方面的资料都是鲜有所见。Delphi7自带的帮助文件是...

weixin_34075268的博客 291

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。

weixin_42525551的博客 1088

Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系。

一、Delphi中各种文件的介绍,及其关系。 OXC: ActiveX控件。会被安装到某一个组件包DPK中,在Imports中会创建PAS、DCU、DCR三个文件。 DLL: 动态链接库文件,它的Exports exports既可以写在工程文件里面,也可以写在Unit里面,没

xiongmao000738 6420

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 426

Blender入门教程-3D视图界面介绍

3D视图用于与3D场景交互,可用于各种目的,例如建模、动画、纹理绘制等。在关闭 启动画面 后,启动场景会显示在3D视口中(如果没有加载其他blend文件)。01 标题栏标题栏包含了基于当前 模式 的各种菜单和控制。

weixin_52345129的博客 2289

DELPHI 缺少DesignEditors单元或是Proxies

我以前也遇到过这样的问题,一般这种问题都是在安装组件的时候才会出现,因为安装组件就有可能会用到delphi的DesignEditors单元,在这个单元文件会用到proxies.dcu, 在Delphi 7~2007下的解决方法: 把uses DsgnIntf 改为 uses DesignIntf,并且在Package Requires列表中加入DesignIDE.dcp,该文件在$(BDS)\

人要有三处长项,首要就是不断学习,记录生活每一点滴.... 1218

MATLAB实战:用Costas环和Gardner环搞定QPSK同步问题(附完整代码)

本文详细介绍了如何使用MATLAB实现Costas环和Gardner环联合解决QPSK同步问题,包括载波同步和定时同步的技术原理、MATLAB代码实现及性能分析。通过完整的仿真示例和工程实践建议,帮助读者掌握QPSK同步技术的核心要点,提升数字通信系统的解调性能。

agile9scrum的博客 691

Delphi 百度智能云 OCR API 调用控件

介绍Delphi 调用百度 OCR 的方法

sensor_WU 博客 2462

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

3、★☛基于STM32的手机通过wifi控LED灯√♠★

3、基于STM32的手机通过wifi控LED灯 文章目录3、基于STM32的手机通过wifi控LED灯1、Introduce介绍1.1、课题背景及其意义1.2、 国内外的研究状况2、方案的设计2.1、控制方案的确定2.2、控制方式的选择2.2.1、 单片机芯片的选择方案一方案二方案三方案四2.2.2、无线遥控模块的选择方案一方案二方案三3、硬件电路的设计3.1、系统的功能分析及体系结构设计3.1.1、系统功能分析3.1.2、系统总体结构3.2、模块电路的设计3.2.1、 STM32单片机核心电路设计3.2.

行走的皮卡丘 2962

Delphi控件开发浅入深出(一)

有人说过“不会开发控件的Delphi程序员不是真正的程序员”。Delphi正是由于高度的可扩展性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光。即使是由于工作需要使用其他开发工具的开发者也常常怀念和Delphi度过的日日夜夜。接触Delphi已经一年多了,从当初对着Delphi组件面板上上百个控件不知所措,到现在已经可以根据需要开发一些有一定难度的控件,其中走过的路是十分艰辛的,所以特此写下...

455

机器学习算法 —— LightGBM

本次我们选择英雄联盟数据集进行LightGBM的场景体验。英雄联盟是2009年美国拳头游戏开发的MOBA竞技网游,在每局比赛中蓝队与红队在同一个地图进行作战,游戏的目标是破坏敌方队伍的防御塔,进而摧毁敌方的水晶枢纽,拿下比赛的胜利。现在共有9881场英雄联盟韩服钻石段位以上的排位比赛数据,数据提供了在十分钟时的游戏状态,包括击杀数、死亡数、金币数量、经验值、等级……参考项目:机器学习系列入门系列[七]:基于英雄联盟数据集的LightGBM的分类预测。

ZShiJ的博客 708

Delphi 各种组件的知识介绍及其安装方法

组件提供的方式不同,安装的方法也不同,下面就目前常见的各种形式的组件的安装方法介绍一下。     1.、DCU文件类型的组件                  DCU文件由单元文件(.pas)或者包文件(.dpk)等编译时产生的中间文件,即编译文件(相当.obj 文件),

xiongmao000738 2256

HTML满屏跳动的爱心(完整代码)

HTML语言实现满屏跳动爱心的完整代码。

AIGC 12万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

动态链接(dynamic link)与静态链接(static link)

静态库与动态库       静态库的所有数据都会被整合进目标代码中,因此编译成的文件比较大。它的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为缺点,(1)首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。(2)再者,一旦发现了静态函

lx123010的专栏 5056

VB摄像头监控

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

DELPHI的编译指令

DELPHI的编译指令

1176

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

delphi的bpl、dcp 、dcu文件意义

BPL 英文全称 Borland Package library ,是一种特殊的DLL文件,用于代码重用和减少可执行文件。既然是DLL文件,那就是在运行时所需要的文件。

hust平凡之路 的博客 9576

[问题解决]delphi中找不到DCU文件问题解决方案

在使用delphi开发的时候经常遇到找不到dcu问题 这个问题很头疼,让人不知道该做怎么去解决,现在总结下遇到的几个问题及解决办法。 第一个:找不到openglox1.dcu 这个的解决办法是在系统中添加环境变量,添加的是delphi的目录下的Bin文件路径 第二个是使用svn更新之后再运行程序报错。 去dcu目录去找代码,物理路径显示有这个文件,但是程序就是找不到。 刚开始以为是代码

苏生-苏米沿的专栏 1万+
下一篇: delphi中各文件的含义
junjle
博客等级 码龄14年 6粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值