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