加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:42:33 所属栏目:大数据 来源:网络整理
导读:我正在考虑使用动态加载BPL并将主应用程序中的对象实例传递给BPL中的方法.这造成应用程序和BPL使用的问题单元. 我写了一个小小的原型,它做了这个,并很好奇Delphi如何内部管理应用程序中定义的类与BPL之间的差异. 例如,说一个基本的Widget类,如: TmyWidget =
我正在考虑使用动态加载BPL并将主应用程序中的对象实例传递给BPL中的方法.这造成应用程序和BPL使用的问题单元.

我写了一个小小的原型,它做了这个,并很好奇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选项可能会带来这个新功能而没有序列化的开销,但它似乎不是很有用,除非你严格保持app和dll重建任何共享代码更改……但在这个原型中,应用程序将保持相当稳定并且动态加载的模块将经常更改,并将功能添加到TmyWidget. (服务器应用程序充当基于客户端请求构建TmyWidget的工厂,应用程序将实例传递给各个模块进行处理.)

解决方法

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

Delphi通过不允许它来管理它.你不能同时在多个包中有一个具有相同名称的单元:如果你这样做,你会收到一条错误消息,说明类似于包XYZ的东西已经包含了ABC(暂时还没有看到……) .由于类型名称包含单元名称,因此在两个不同的包中不能使用相同的类型.除非它是由它的GUID定义的接口,否则这是一个不同的故事.

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

你没有将对象传递给DLL,这不是一个好主意.当您需要将对象传递给BPL时,请确保将该BPL的基类定义为第3个BPL.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读