我在StackOverlow上阅读了许多关于Delphi中插件的问题(如this one)。
无论如何,我仍有疑问,我想讨论我的实际情况。
我开发了一个庞大的应用程序,只是为了让它知道它是一个“胖客户端”客户端/服务器应用程序,具有80MB的exe(大尺寸主要是由于我使用的许多第三方组件)。
我要求过多地修改这个应用程序,所以我最终想到了编写插件,因为一旦创建了“插件基础”,我想我可以更快地添加新功能。
我最初的想法是将exes编写为插件(我可以从主应用程序传递一个命令行参数到插件exe,我将连接字符串传递给db - 可能加密)。
但我意识到这限制了我太多。 (并且exe不是“真正的插件”)
让我试着通过一个现实世界的例子来表达自己。
我的应用程序有多种形式,其中大多数都带有tabcontrol。
让我们以客户(想到CRM软件)的形式。
此表单有一个主要选项卡,其中包含主要数据(公司名称,地址,主要电话,主电子邮件地址......),然后有一个“联系人”选项卡(包含其个人数据的联系人列表)以及许多其他选项卡具体到我的申请。
假设我想从插件中添加一个新标签页。
我做了一个愚蠢的例子。
插件是ChristmasGIfts.dll(用于管理我在圣诞节时为客户提供的comapny礼物)
此插件应在客户表单中添加带有标题“Xmas Gifts”的新标签。
标签的内容将是一个“框架/表格”,允许用户定义哪些礼物应该发送给客户以供下一个XMas +查看去年的历史。
所以这个“新标签”将有自己的逻辑(数据模块)和自己的控件(框架/表格)。
此外,当我点击“保存”按钮时,我的主要应用程序也必须验证插件数据(例如“你必须至少插入一个XMas礼物”)。
我不清楚如何制定这种架构。
不知怎的,我的问题是:
1)如何从dll中提取框架/表单,以便在运行时将其添加到我的表单中?
2)如何委托dll进行数据验证并返回消息
我希望你能提供帮助。
答案 0 :(得分:1)
首先,停止将插件视为DLL。在Delphi中,它们应该是包。 Delphi软件包是DLL,但它们带有类型信息,因此可以轻松地集成到主应用程序中。你在德尔福见过一些巫师吗?它们都是实现表单,框架甚至DataMdules
的软件包,由Delphi IDE加载,正如您在应用程序中所需的那样。
通常你要做的是在某个基础架构包(例如TPlugIn
)或最终的接口(IPlugIn
)中声明一个插件类,并在主应用程序和plugint文件夹中使用它
每个plugint包都应声明一个入口点函数(例如,一个名为StartPlugIn
的函数),它将返回插件实例。这个类或接口将为您提供一些与之交互的方法,允许您命令实例化框架或验证数据或您喜欢的内容。例如,此实例可以通知您的应用程序创建一个新的主菜单项来访问它。
您的主应用程序必须知道它应该加载的所有软件包。例如,您可以建立一个必须存储所有插件包的文件夹。当应用程序启动时,它将加载此文件夹中存在的所有包并加载所有插件。然后,当时间到了,插件将开始工作。
在我看来,这是一种能够为您提供所有想要的设计。