外部模块实现

时间:2011-08-20 11:27:07

标签: delphi plugins resources module bpl

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

我真正需要的是非常基本的:

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

我需要在其他表单中使用商店表单,并且只能作为standAlone

使用

我使用类似的东西

        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,因此ideia是改变应用程序ICO只是改变外部模块。

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

查看运行时BPL,但似乎并不了解如何执行此操作。 感谢。

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

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

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

这篇文章很古老但很简单。

那么逻辑就在那里我似乎没有把它展示给表格

我只是在测试示例2

它加载BPL,但没有得到Form:

AClass := GetClass('TForm2');

始终检索'nil'

但BPL注册时:

RegisterClass(TForm2);

任何人都可以帮助这个。

2 个答案:

答案 0 :(得分:4)

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

我个人更愿意通过许多界面公开应用程序的功能。这允许使用Delphi以外的语言进行访问。

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

答案 1 :(得分:3)

我为你做了一个演示,它很容易上手!但是......开始还没完成。

每次我开始使用插件时,我后来后悔了。但是,正如您所说,您需要一个二进制插件系统。所以BPL是正确的解决方案。 David建议使用接口(使用普通的DLL而不是完整的运行时包BPL),这样可以解决一些常见的BPL不稳定性问题,因为不对类进行版本控制,从而解决了应用程序和包 - 二进制兼容性依赖关系,正常。如果您不需要共享内存而不需要使用borlandmm.dll(共享内存管理),那么带接口的直接DLL将正常工作。

如果您只需编写脚本就能完成所有操作,并使用脚本制作插件系统,那么就这样做。如果你可以逃脱DLL,接口和没有内存共享,那么使用普通的DLL。如果你必须共享内存和类类型,那么是的,使用BPL。

请注意,使用BPL(运行时软件包)会带来许多您可能没有预料到的副作用。我工作过的最大的基于BPL的应用程序比我工作的任何单片应用程序更糟糕,更不稳定。似乎只有在你尝试它们之前才能松开包装,然后我发现,我再次松开了整块石头。

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

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