2011-08-20 71 views
5

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

我需要的是非常基本的实在:

  • 主要的应用程序会检测是否有模块存在,并将其加载(运行时间)
  • 模块可以存储形式
  • 模块可以存储数据模块
  • 模块可以存储代码

我需要使用其他表单中的存储表单,并且只能作为独立的

我使用这样的

 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,但似乎并不明白如何去做。 谢谢。

UPDATE:.....................................

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

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

这篇文章是老东西,但令人惊讶的简单。

那么逻辑是有我只是似乎没有得到它显示的形式

我只是测试例2

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

AClass := GetClass('TForm2'); 

始终retrievex '零'

但BPL,因为它注册:

RegisterClass(TForm2); 

任何人都可以帮助这个。

+1

你可能会发现更多的信息,如果你寻找插件 –

+0

这真的是一个重复的,只要看看右边的相关问题的列表 –

+0

刚刚做了,谢谢。在那里找到我的解决方案。 – Jlouro

回答

2

我给你做了一个演示,它很容易上手!然而...开始没有完成。

每当我开始使用插件,我后来都后悔了。但是,正如你所说,你需要一个二进制插件系统。所以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文件。

+0

我需要的是将表单,数据模块和资源存储在BPL中。我们的目标是为主APP创建额外的模块,我给客户或不给客户。每次构建主体时,我都会重建模块(BPL)。 DELPHI版本不是我在2007年工作的问题,并且计划将它保留一段时间以使其扩展。现在不工作的是GetClass。 – Jlouro

+0

我给你做了一个演示,看看上面的答案上面的链接!如果你没有使用delphi XE,那么删除DPROJ文件,然后打开.dpr文件,它仍然可以工作。 –

+0

感谢您的DEMO,但“mainFormMainUnit1.pas”丢失。 – Jlouro

4

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

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

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

+1

如果他想要将Datamodules和Delphi表单作为问题状态返回,则此建议不是很有用。由于返回的表单将依赖Delphi和版本 –

+0

但是,警告人们远离鲨鱼出没的水域是个好主意。因此,大卫+1。 –