如何通过插件向现有应用程序添加功能?

时间:2014-09-15 09:04:07

标签: delphi plugins delphi-xe2

我在StackOverlow上阅读了许多关于Delphi中插件的问题(如this one)。

无论如何,我仍有疑问,我想讨论我的实际情况。

我开发了一个庞大的应用程序,只是为了让它知道它是一个“胖客户端”客户端/服务器应用程序,具有80MB的exe(大尺寸主要是由于我使用的许多第三方组件)。

我要求过多地修改这个应用程序,所以我最终想到了编写插件,因为一旦创建了“插件基础”,我想我可以更快地添加新功能。

我最初的想法是将exes编写为插件(我可以从主应用程序传递一个命令行参数到插件exe,我将连接字符串传递给db - 可能加密)。

但我意识到这限制了我太多。 (并且exe不是“真正的插件”)

让我试着通过一个现实世界的例子来表达自己。

我的应用程序有多种形式,其中大多数都带有tabcontrol。

让我们以客户(想到CRM软件)的形式。

此表单有一个主要选项卡,其中包含主要数据(公司名称,地址,主要电话,主电子邮件地址......),然后有一个“联系人”选项卡(包含其个人数据的联系人列表)以及许多其他选项卡具体到我的申请。

假设我想从插件中添加一个新标签页。

我做了一个愚蠢的例子。

插件是ChristmasGIfts.dll(用于管理我在圣诞节时为客户提供的comapny礼物)

此插件应在客户表单中添加带有标题“Xmas Gifts”的新标签。

标签的内容将是一个“框架/表格”,允许用户定义哪些礼物应该发送给客户以供下一个XMas +查看去年的历史。

所以这个“新标签”将有自己的逻辑(数据模块)和自己的控件(框架/表格)。

此外,当我点击“保存”按钮时,我的主要应用程序也必须验证插件数据(例如“你必须至少插入一个XMas礼物”)。

我不清楚如何制定这种架构。

不知怎的,我的问题是:

1)如何从dll中提取框架/表单,以便在运行时将其添加到我的表单中?

2)如何委托dll进行数据验证并返回消息

我希望你能提供帮助。

1 个答案:

答案 0 :(得分:1)

首先,停止将插件视为DLL。在Delphi中,它们应该是。 Delphi软件包是DLL,但它们带有类型信息,因此可以轻松地集成到主应用程序中。你在德尔福见过一些巫师吗?它们都是实现表单,框架甚至DataMdules的软件包,由Delphi IDE加载,正如您在应用程序中所需的那样。

通常你要做的是在某个基础架构包(例如TPlugIn)或最终的接口(IPlugIn)中声明一个插件类,并在主应用程序和plugint文件夹中使用它

每个plugint包都应声明一个入口点函数(例如,一个名为StartPlugIn的函数),它将返回插件实例。这个类或接口将为您提供一些与之交互的方法,允许您命令实例化框架或验证数据或您喜欢的内容。例如,此实例可以通知您的应用程序创建一个新的主菜单项来访问它。

您的主应用程序必须知道它应该加载的所有软件包。例如,您可以建立一个必须存储所有插件包的文件夹。当应用程序启动时,它将加载此文件夹中存在的所有包并加载所有插件。然后,当时间到了,插件将开始工作。

在我看来,这是一种能够为您提供所有想要的设计。