【问题标题】:External modules implementation外部模块实现
【发布时间】:2011-09-03 09:21:14
【问题描述】:

为 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,我通常存储 ImageList,因此我的想法是更改应用程序 ICO,只需稍微更改外部模块即可。

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

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

更新:.....................................强>

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

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

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

嗯,逻辑就在那里,我只是似乎没有得到它来显示表格

我只是在测试示例 2

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

AClass := GetClass('TForm2');

总是检索'nil'

但是注册的 BPL:

RegisterClass(TForm2);

谁能帮忙解决这个问题。

【问题讨论】:

  • 如果您寻找插件,您可能会找到更多信息
  • 这确实是重复的,看右边的相关问题列表就行了
  • 刚刚做了,谢谢。刚刚在那里找到了我的解决方案。
  • 你不需要使用GetClass。请参阅我的答案以获取演示。

标签: delphi plugins resources module bpl


【解决方案1】:

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

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

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

【讨论】:

  • 如果他想按照问题所述返回 Datamodules 和 Delphi 表单,那么这个建议就没那么有用了。因为返回的表单无论如何都会依赖于 Delphi 和版本
  • 但是警告人们远离鲨鱼出没的水域是个好主意。因此,为大卫 +1。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 我需要在 BPL 中存储表单、数据模块和资源。目标是为主 APP 创建额外的模块,无论我是否给客户端。每次我构建主程序时,我都会重新构建模块(BPL)。 DELPHI 版本不是我在 2007 年工作的问题,并计划将其保留一段时间以扩展。现在不工作的是 GetClass。
  • 我给你做了一个demo,看上面的最后一个链接答案!如果您没有使用 delphi XE,则删除 DPROJ 文件,然后打开 .dpr 文件,它应该仍然可以工作。
  • 感谢演示,但缺少“mainFormMainUnit1.pas”。
  • 我修复了 zip 文件并再次上传。从上面的相同链接下载 plugin_r2.zip。
  • 在实际实现中,您可能希望它注册多个表单,也许您可​​能希望让主应用程序通过类名来决定要实例化哪些表单。您可能还想让插件访问主应用程序的数据等等。所以显然它会变得更加复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多