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

delphi – 动态加载BPL的共享代码传递对象,第1张

概述我正在考虑使用动态加载BPL并将主应用程序中的对象实例传递给BPL中的方法.这造成应用程序和BPL使用的问题单元. 我写了一个小小的原型,它做了这个,并很好奇Delphi如何内部管理应用程序中定义的类与BPL之间的差异. 例如,说一个基本的Widget类,如: TmyWidget = classprivate fId:Integer; fDescription:String;publi 我正在考虑使用动态加载BPL并将主应用程序中的对象实例传递给BPL中的方法.这造成应用程序和BPL使用的问题单元.

我写了一个小小的原型,它做了这个,并很好奇Delphi如何内部管理应用程序中定义的类与BPL之间的差异.

例如,说一个基本的Widget类,如:

TmyWidget = classprivate  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中,以便于传递对象.

总结

以上是内存溢出为你收集整理的delphi – 动态加载BPL的共享代码/传递对象全部内容,希望文章能够帮你解决delphi – 动态加载BPL的共享代码/传递对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1270258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存