这将允许用户社区将扩展程序写入我的程序来访问内部数据并添加他们可能会发现有用的功能.
我已经看到了这个帖子:Suggestions for Adding Plugin Capability?,但是它的答案似乎不可转让给Delphi程序.
如果可能,我希望添加此功能,并将我的应用程序保留为单个可执行文件,而不需要任何DLL或附加模块.
你知道有什么资源,组件或者文章,建议如何最好地在德尔福,或者你有自己的建议吗?
解决方法
后者更容易,并开辟了两种可能性.其他人已经提到了DLL,这是第一个走的路.一些注意事项适用 – 一般来说,您应该仅使用Windows API中使用的数据类型与dll进行连接.这样你可以确定插件DLL将会了解你的数据类型,无论他们创建了什么语言/编译器(例如,使用PChars,而不是字符串).不要像Delphi一样通过Delphi类,如TStream一个DLL,这在某些情况下似乎是有效的,但是一般来说是不安全的,因为即使DLL是在Delphi中编译的,它可能是编译器的不同版本,与TStream是一样的). Google在Delphi中使用DLL,你会发现更多的提示.
还没有提到的另一种方法是在应用程序本身中启用脚本.有几个非常有能力的第三方脚本引擎,无论是商业还是免费的,其中大多数都允许您使用脚本来交换Delphi对象.这些库中的一些仅支持Pascal作为脚本语言,其他库可以让您使用Basic(或许更适合初学者用户)或其他语言.参见例如:Remogs Pascal Script(free)at http://www.remobjects.com/free.aspx.
我最喜欢的脚本解决方案目前是从http://mmm-experts.com/Products.aspx?ProductID=3开始的Delphi(P4D,也是免费版)的Python.它可以通过RTTI与您的课程进行精美的界面,并允许您在Delphi应用程序中执行Python代码,并在Python脚本中使用Delphi类.鉴于Python的普及,如果您希望吸引开发人员到您的项目,这可能是一个可行的解决方案.但是,每个用户都需要安装Python发行版.
在我看来,从潜在的插件编写者的角度来看,如果您使用脚本而不是选择DLL,则入门的障碍将更低.
现在,回到我最初的问题:如果您需要插件与您的用户界面进行交互,事情会变得更加复杂,例如通过放置控件.一般来说,DLL不能用于这样做. Borland / CodeGear认可的方式是使用包(BPL).使用BPL,您可以访问和实例化插件提供的类,就像在主机应用程序中声明的一样.捕获的是,所有BPL必须与您的主要应用程序相同的确切版本和Delphi的版本进行编译.在我看来,这使得包完全不切实际,因为很难期望世界各地的所有潜在的插件作家将使用与之相同的版本的Delphi.一个主要的陷阱.
为了解决这个问题,我已经尝试了一种不同的方法:继续使用DLL,并开发插件的语法来描述所需的UI,然后在主机应用程序中自己创建UI. (XML是一种方便的方式来表达UI,因为您可以免费获得父母/嵌套的概念.)UI描述语法可以包括在控件的内容或状态更改时触发的DLL的回调.此方法将会将插件限制在应用程序已经使用或已注册的VCL控件集中.这不是一个更重要的工作,而BPL肯定是.