我写了一个小小的原型,它做了这个,并很好奇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的共享代码/传递对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)