gpt4 book ai didi

delphi - 动态加载BPL的共享代码/传递对象

转载 作者:行者123 更新时间:2023-12-03 15:16:40 25 4
gpt4 key购买 nike

我正在考虑使用动态加载 BPL 并将对象实例从主应用程序传递到 BPL 中的方法。这在应用程序和 BPL 使用的单元之间造成了问题。

我编写了一个小型原型(prototype)来执行此操作,并且很好奇 Delphi 如何在内部管理应用程序与 BPL 中定义的类之间的差异。

例如,假设一个基本的 Widget 类,例如:

TmyWidget = class
private
fId:Integer;
fDescription:String;
public
procedure DoSomething1();
end;

现在应用程序和 BPL 是使用包含 TmyWidget 类的单元构建的。后来,TMyWidget 中发生了一些变化,应用程序被重建,但 BPL 没有(反之亦然)。我添加了另一个方法 DoSomething2() 并在应用程序中创建了 TmyWidget 的实例,并将其传递给 BPL 进行处理,然后在基本的例子,它有效。但它显然充满了潜在的问题。

如果另一个动态加载的 BPL 也使用 TmyWidget 那么事情会变得更加有趣。这似乎有效,但感觉绝对不理想。

主要问题是 - 通常如何在主应用程序和 DLL 或 BPL 之间传递对象?我以前从未尝试过,并且可能有充分的理由,但我有一个适合这种方法的想法......

我认为最好的方法是序列化对象并传递这些字节并在 DLL/BPL 中反序列化它,此过程要注意主机和动态加载模块之间的潜在版本差异,但我希望新的 SimpleSharedMem 选项可能会带来这个新功能,而无需序列化的开销,但它似乎不是很有用,除非您严格保持应用程序和 dll 在任何共享代码更改上重建......但在这个原型(prototype)中,应用程序将保持相当恒定,动态加载的模块会随着功能添加到 TmyWidget 而频繁变化。 (服务器应用程序充当根据客户端请求构建 TmyWidget 的工厂,并且应用程序会将实例传递给各个模块进行处理。)

最佳答案

...was curious how Delphi internally manages differences between classes defined in the app vs. the BPL

Delphi 通过不允许它来管理它。您不能同时在多个包中拥有同名的单元:如果您这样做,您会收到一条错误消息,内容类似于 Package XYZ已经包含 ABC (还没有看到等一下...)。由于类型名称包含单元名称,因此两个不同的包中不能有相同的类型。除非它是由 GUID 定义的接口(interface),但这是一个不同的故事。

... how does one typically pass objects to and from the main application and DLLs or BPLs?

您不将对象传递给 DLL,这不是一个好主意。当您需要将对象传递给 BPL 时,请确保将该 BPL 的基类定义到第三个 BPL 中。

示例。 TmyWidget 的多态行为可能是使用一些虚拟方法定义的。确保您有一个定义所有这些虚拟方法的 TmyWidgetBase 类,从该基类派生所有 TmyWidget 并传递类型为 TmyWidgetBase 的对象。确保 TmyWidgetBase 类位于它自己的包中。

当我尝试这样做时,我最终得到了一个很小的“引导”exe 和很多 BPL。本质上所有逻辑都在 BPL 中,以方便传递对象。

关于delphi - 动态加载BPL的共享代码/传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com