DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maxding
今日帖子: 36
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/4 16:12:37
标题:
一直有一个疑问希望大佬指点 浏览:1045
加入我的收藏
楼主: 1.BPL  能否动态加载(能)主程序不带包编译能不能?
2.如果1 是能   那bpl是不是就和DLL基本一致了?
3.如果bpl在主程序 不带包编译的情况下可以动态加载对比 加载DLL 有没有点啥好处?
比如 处理字符串 或者直接导出类等等。
4.听说用fastmm4(自带)之后,不需要borlandmem.dll 就可以使用string了?是么?

说的比较乱  见谅
----------------------------------------------
-
作者:
男 kwer (★★★★★) ★☆☆☆☆ -
普通会员
2024/6/4 16:26:44
1楼: bpl和dll基本是一样的,连用法都是一样
区别就在于dll只能调用函数,bpl那可就强很多了,相当于use Forms 
aForm := TForm.Create 就问你用dll能这么玩吗?
----------------------------------------------
==========-==========-==========-==========-==========
     多隆, 给我备一匹最快的马, 我有事要走先~~~
==========-==========-==========-==========-==========
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2024/6/4 19:56:33
2楼: bpl相当于单元文件,里面的类、接口等delphi的类型别的模块都能够使用。
但是你必须附带一大堆bpl文件。
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/6/4 19:58:57
3楼: DLL一样,也会依赖其他DLL,形成相互依赖关系。
不爽的是,EXE可以选择静态链接,但bpl包没这个选项。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/4 20:49:40
4楼: @kwer
@sxqwhxq
这一切的前提是 得带包编译。

主程序静态  能否载入 和DLL是否还有啥差别?
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/6/5 7:31:39
5楼: 带包编译,确保所有的exe, bpl都使用同一套全局变量数据,这些数据当中包括了整套类型信息例如对象继承树。

如果主程序exe没有带包编译而加载了BPL文件,那exe就拥有独自一套的全局数据,它的所有TObject子类类型信息都指向与BPL不同的类型信息,后果与加载DLL一样。

稍微不同的只是:所有被加载的BPL共用一套全局数据,而DLL则每个有自己的一套全局数据。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/5 9:22:22
6楼: @roadrunner

主程序静态,动态加载bpl。能否导出类或者比dll有啥好处?
----------------------------------------------
-
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2024/6/5 10:42:13
7楼: 其實不帶包編譯也可以,就是必須獨立,不引用任何其它第三方包的控件和方法等,也就是你如果是在Windows下開發,那就只跟WindowsAPI對接,或者其它公用的dll接口等等,但是這樣的話工作量無疑是巨大的,而且難度也大,除非是很簡單,需求就特定那麼幾個功能,那還可以。
----------------------------------------------
Everyone will to do best!
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/5 23:41:25
8楼: @grjs_2004

相对于DLL有没有啥优势呢?导出类之类的?

另外 使用fastmm4 是不是可以不带boarlandmm.dll?
----------------------------------------------
-
作者:
男 bcc2cc (bcc2cc) ▲▲▲▲△ -
普通会员
2024/6/6 0:31:56
9楼: 帮贴主省下时间, 下面是标准答案,看这即可:

bpl 就是一个标准的 dll
如果你误以为bpl比dll能干, 那只是你对dll不够了解
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/6/6 8:02:40
10楼: @8楼,把相关的pas静态编译进项目就可以了:
https://github.com/maximmasiutin/FastMM4-AVX/blob/master/Replacement%20BorlndMM%20DLL/Delphi/BorlndMM.dpr
https://github.com/pleriche/FastMM4/blob/master/Replacement%20BorlndMM%20DLL/Delphi/BorlndMM.dpr
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/6 10:49:24
11楼: @tony2u
谢谢。那么带上boardlandmm这个源码就不需要带DLL了。

如果主程序是静态。然后动态加载BPL 真就和普通DLL没区别了?
----------------------------------------------
-
作者:
男 jfhyn (贺兰之边) ★☆☆☆☆ -
普通会员
2024/6/6 14:12:00
12楼: 用BPL的目的就是方便的共享公共资源,操作方便. 用DLL也是能实现,但是很复杂,所以Delphi进行了封装处理,就变成了BPL.
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/6 17:31:06
13楼: 9 楼说得对:BPL 就是一个 DLL;

但是,BPL 是在 DLL 基础上做了扩展。

DLL 是一个二进制的标准,这个标准就是接口。因为定义了一个标准的二进制接口,因此,各个程序可以通过这个接口去调用它。但是,这个接口是 C 语言标准的,接口里面没有对 Delphi 的数据类型比如 Delphi 的类,Delphi 的 IInterface 等等类型的支持。因此 Delphi 程序无法用 function GetMyMessage(const S: string; AForm: TForm) 这样的函数定义的方式去调用接口。

因此,扩展出来的 bpl 可以使用这些数据类型,因此 Delphi 用起来更加方便。

至于 BPL 的用法,也就是程序的模块化,插件化,甚至根据当前需求动态替换某个模块等等。比如 Delphi IDE 里面安装控件,其实就是以 BPL 的方式,作为插件,被 IDE 的程序加载进去的。

BPL 想要足够灵活,一个是采用动态加载,也就是程序运行起来后,适当的时候才加载;一个是采用接口,采用 IInterface 的方式来编程那些 function 和 procedure。
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/6 22:13:19
14楼: 所谓的 DLL ,其实和 exe 没有区别:二进制映像加载的规则;无论哪种操作系统,windows 的 DLL,linux 的 so,不一而足;而 bpl,就是在系统的支持上增加了 delphi 的一套规则;遵从于软件分层的思维。完全可以用 TCP 协议和 HTTP 协议的关系来类比,如果说 dll 类似于 TCP ,那么 bpl 就类似于 HTTP了;TCP 层次低,支持的功能有限,但是能支持更多扩展,HTTP 层次高,支持的功能多,但再次开发的限制也大。
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/6 22:28:38
15楼: 另外,所谓的类变量访问和类成员函数访问,落到二进制代码上,归根结底都是CPU对内存的寻址,delphi是以基地址加上偏移来做,c++,或者c都是一样的方式。但是由于语言的门户限制,访问效果是不一样的,比如说:普通类成员函数,代码是直接寻址的(exe或者dll中代码中写死了地址,通过系统加载的时候修正thunk来实现正确定位),而虚函数,或者类虚函数,是通过类型指针查询到 VMT 再进行函数寻址。这点上delphi和c++一致,但也仅在算法理论上一致;delphi中实例的地址,以及通过实例查询到的相关类型的地址计算方法可和c++不一样(就是基于基址的偏移是不一样的);所以编译系统导出类,根本没意义,换种语言就完全无法访问。这也是为何当前的操作系统都进化到面向对象,但其提供的API从来都类似于面向过程;每个API都会有一个Handle以进行内核和应用层交互时候的对象标定。而 OLE ,这其实是微软为了绕过各种编译系统的限制提出的一套通用类调用规则(就跟 bpl 差不多),所以编译系统只要支持了 IUnknown 就可以互相提供实例,以达到天下一统的目的。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/7 0:24:04
16楼: 编译系统导出类当然有意义。真正编译的代码,任何代码都可以用机器语言来调用,部就是内存指针跑来跑去嘛。问题是这样烦不烦?所以才有高级语言。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/7 11:25:12
17楼: 所以还是没人知道么?


如果主程序是静态。然后动态加载BPL 真就和普通DLL没区别了?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/7 11:46:06
18楼: 17 楼,你所谓的没区别,究竟是什么意思?

问题没有描述清楚,没人能回答你。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/7 14:12:08
19楼: @pcplayer

如果主程序是静态。然后动态加载BPL此时BPL和DLL 有什么区别或者优势?

能否更方便的使用类?导出类?之类的啊。DLL就是纯函数啊。区别就是在DLL之外的功能。DLL只能纯函数 BPL有没有优势,比如导出类,或者互相共享之类的
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/7 15:41:06
20楼: 什么叫做【如果主程序是静态】?

主程序就是个 EXE,你执行它,它就自己加载进内存跑起来。有什么动态静态?

这里唯一的区别是作为二进制的库,不管是 DLL 还是 BPL,有个加载的概念。加载有静态和动态之分。

所谓的静态加载,就是主程序启动时马上就自己加载这个外部库 -- 一个外部的二进制可执行文件,文件名是 DLL 或者 BPL;这个由主程序的编译设置决定。

另外一种是主程序运行,它就运行了,并不立即加载外部库。当程序运行中,比如用户点了某个按钮,我们再用代码去加载这个外部库。这种通常叫动态加载。

不知道你说的动态静态是不是这个意思。

这个动态或者静态加载外部库,当然有区别。比如我们的程序多半会使用一些外部库,而这些库是操作系统一定会带来的,比如 WIN32 API 的那一大堆函数是 WINDOWS 系统里面一定有的,我们不用去考虑如何加载,程序启动会自己去加载。

但是,如果你的程序需要加载的某个库,假设在系统里面不存在,那程序可能直接就崩溃了,根本运行不起来。

但是如果你用 LoadLibrary 这个方法,在运行期动态加载这个库,即便这个库不存在,你的程序照样可以继续运行。而且,你的程序运行过程中,你还可以通过代码判断,根据不同的情况,加载不同的库,达到类似【多态】的目的。

至于 DLL 和 BPL 的区别,那就是你的 EXE 程序可以直接使用 BPL 里面的 Delphi 的接口和对象啊。

如果我的程序要规划为多个 BPL 的这种架构,我不单使用 BPL, 我还会给 BPL 里面的类,加上接口。假设有2个不同的 BPL,里面的代码实现得不一样,但里面的类都支持相同的接口定义,这样主程序在使用这个 BPL 的地方的代码就仅仅调用接口,然后根据不同条件加载不同的 BPL,获得的接口 -  IInterface 是相同的,因此调用的地方使用接口,使得相同的代码,因为加载不同的 BPL 而获得不同的执行结果。

我有博客写 BPL,不止一篇,你自己去搜:

https://blog.csdn.net/pcplayer/article/details/69374883

https://blog.csdn.net/pcplayer/article/details/69374921
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/7 16:43:06
21楼: @pcplayer
主程序不使用带包编译。这总清楚了吧。

主程序不带包编译 使用bpl 和DLL  的区别。


Delphi 的接口和对象啊 就不能用了吧?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/7 19:20:19
22楼: 带包编译和不带包编译,这个问题和 DLL 没关系。仅仅是 BPL 的用法问题。简单说就是这个库是作为 DCU 直接编译到 EXE 的二进制文件里面,还是在一个 BPL 外部文件里面。

至于 DLL,也是一个库。但这个和 DELPHI 本身没有关系。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/8 12:52:07
23楼: @pcplayer

所以。

主程序不带包编译  使用BPL和使用DLL  有何差别?有没有BPL的优点?

我不是问啥是带包编译。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 13:04:12
24楼: 如果主程序是静态。然后动态加载BPL此时BPL和DLL 没有任何区别和优势

这就和直接从DLL返回string或者tobject的效果是完全一模一样的。

而且,BPL依赖的其他BPL一个都不能省,完全不会因为主程序静态了就可以节约BPL文件数量。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/8 14:04:44
25楼: @roadrunner
谢谢。

那就是说如果不是采用带包编译这种方式  bpl 就没有啥好处了。

不存在能导出类 之类的 优势
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 22:18:30
26楼: 楼上那么多人说了半天白说了。
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/10 22:22:07
27楼: 因为底层没搞清楚,浮在表面说来说去就那些口水话;没一点儿帮助的。只要稍微懂一些底层逻辑,就知道这问题根本没意义
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/11 10:59:43
28楼: 都说这个问题没意义? 那就当我没问吧。

我老老实实用DLL即可
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/11 11:00:33
29楼: 这么简简单单的问题 居然没人能说清楚。
说不清楚就算了  解决不了问题 就去解决问问题的人~ 好主意
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 11:38:46
30楼: 因为没人知道你想问啥。我想了一下,你想问的应该是将代码分布在不同的二进制映像,然后运行时刻加载;以及所有代码静态编译到一个二进制映像这两种架构的区别,以及如何保证多二进制映像加载时候的运行稳定性。
而你看到了 BPL 的结构灵活,稳定性又挺不错,就想借用它的体系。但是,delphi 为 bpl 指定了特别的导出函数set并通过这些函数来保证不同二进制映像之间的底层架构的一致性(比如内存分配管理器以及很多基础通用类的实例的统一,sharemm干嘛了?其实就是把内存管理器统一起来,将 EXE 与其加载所有 DLL 使用的内存管理器都指向自身内部,以保证不会出现两套不同的内存管理流程,避免因为访问违规而导致进程崩溃:string和动态数组都有引用计数,如果 exe 和 dll 各自维护一套计数器,那么在多次修改后,肯定会出现紊乱)。
在不理解这些底层技术之上的各种现象的描述有何意义?当你的眼光放到这个层面,就知道你的问题没有任何意义。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/11 13:19:01
31楼: @bighawk
我为什么一定要理解这些东西才可以用bpl?

你用DLL要先去了解DLL的底层是怎么工作的?

问题很简单。
就是在主程序不适用带包编译的前提下,使用bpl和d标准dll  有何不同?

这么一个问题你要扯到 二进制 扯架构  是我的问题难度太大了?你理解不了?
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 14:11:06
32楼: 前面已经回答了:没啥不同,完全一致;只是你得自己实现 delphi 帮你实现了的所有接口调用规则。而为啥要实现,就自己想吧
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行1410.156毫秒 RSS