5

为 DELPHI 应用程序实现外部模块系统的最佳方式是什么?

我需要的是非常基本的:

  • 主APP检测模块是否存在并加载它(运行时)
  • 模块可以存储表单
  • 模块可以存储 DataModules
  • 模块可以存储代码

我需要在其他表格中使用商店表格,并且仅作为独立表格

我用这样的东西

        if Assigned(pNewClass) then begin
            Application.CreateForm(pNewClass, _lFrm);
            _lFrm.Hide;
            _lFrm.BorderStyle := bsNone;
            _lFrm.Parent := pBasePNL //(TPanel);
            _lFrm.Align := alClient;
        end;

所以我创建了一个 TForm,但是把它放在一个 TPanel 里面。

至于DataModules,我通常存储ImageLists,所以想法是改变应用程序ICO,只是稍微改变外部模块。

那么实现这一目标的最佳方法是什么?

查看了运行时 BPL,但似乎不明白如何去做。谢谢。

更新 : .....................................

在阅读了一些相关的问题和答案后,我想我找到了答案和解决方案。

http://edn.embarcadero.com/article/27178

这篇文章是旧的东西,但非常简单。

那么逻辑就在那里,我似乎没有得到它来显示表格</p>

我只是在测试示例 2

它加载 BPL,但没有得到表单:

AClass := GetClass('TForm2');

总是检索 x 'nil'</p>

但是注册时的 BPL:

RegisterClass(TForm2);

任何人都可以帮助解决这个问题。

4

2 回答 2

4

包是一种简单的解决方案,但它们有一个巨大的缺点。使用包会迫使插件作者不仅使用 Delphi,而且与您使用相同版本的编译器。

我个人更喜欢通过一些接口来公开应用程序的功能。这允许从 Delphi 以外的语言访问。

通常,插件将在 DLL 中实现,并导出应用程序调用的函数,以传递代表应用程序的根接口。然后插件将调用该接口的方法,从而建立双向交互。

于 2011-08-20T12:02:00.930 回答
3

我给你做了一个demo,上手很简单!然而... 开始并没有结束。

每次我开始使用插件,我后来都后悔了。但是,正如您所说,您需要一个二进制插件系统。所以 BPL 是正确的解决方案。David 建议使用接口(使用普通的 DLL,而不是完整的运行时包 BPL),这将解决由于未对类进行版本控制而导致的一些常见的 BPL 不稳定问题,因此您的 Application-and-package-binary-compatibility 依赖项,适当地。如果您不需要共享内存并且不需要使用 borlandmm.dll(共享内存管理),那么带有接口的直接 DLL 就可以正常工作。

如果你可以只用脚本做你需要做的所有事情,并且只用脚本来制作你的插件系统,那么就这样做吧。如果您可以摆脱 DLL、接口和不共享内存,那么请使用普通 DLL。如果您必须共享内存和类类型,那么可以,使用 BPL。

请注意,使用 BPL(运行时包)会带来很多您可能没有预料到的副作用。我从事过的最大的基于 BPL 的应用程序比我从事过的任何单体应用程序都更加混乱且不稳定。似乎只有在您尝试它们之前,才有可能为包松树,然后我发现,我再次为巨石松树。

如果您正确使用 BPL 包,并且正确地对插件进行版本控制,那么一切都很好。BPL 很棒。但在现实世界中,健全的版本控制和 ABI 兼容性、互操作性以及稳定性似乎非常重要。

更新: 我给你做了一个演示,它在这里(plugin_r2.zip)。它是在 Delphi XE 中完成的,但如果您使用的是旧版本的 delphi,您只需删除 .dproj 文件并打开主应用程序的 .dpr 文件和软件包的 .dpk 文件。

于 2011-09-01T09:23:42.763 回答