如何在运行时向程序中添加代码 (Delphi/Windows)?

3
我正在使用Windows XP/Delphi 7。我需要在程序运行时添加一些过程(或函数),完成后不想重新编译它。
我只有一个主机应用程序,其中包含5个函数以发送不同类型的警报,但是还有其他新的警报类型,因此我必须编写新函数来发送这些警报,但不应重新构建主机应用程序。我有一个名为TAlarmManager的类,调用这些函数。
也许可以使用插件??好的,但是如何“插入”新功能???有关此主题的教程、手册、书籍等学习资料,或任何关于如何实现此目标的建议?
我已经研究了插件(对此完全陌生),但没有人谈论如何向主机应用程序添加函数。在我看来,插件会从自身代码中添加功能,也就是说,它们是通过开发自己的代码来执行某些操作,而不是“添加”代码到主机应用程序中…… 我该怎么做?
9个回答

4
对于技术方面:Delphi IDE是如何实现的?这将是我寻找答案的第一个地方。
要理解插件,必须明白不能添加新的功能。虽然可以添加,但由于旧代码不知道如何调用它们,因此它们不会被调用。
因此,您需要向插件添加一个“注册”或“启动”函数。该启动函数将获得数据结构作为参数,可以检查或扩展该结构。在您的情况下,这将是警报列表。警报始终按照相同的方式工作(我猜),因此可以添加其他警报。
主代码将在注册所有插件后,只需遍历警报列表并在每个警报上调用标准警报函数。它不再关心每个警报来自何处以及它们实际上执行什么操作。
关键在于:您需要定义一个接口,双方都订阅该接口。主代码调用接口函数,您的插件代码实现它们。

3

另一个可用的选择是在项目中使用脚本组件。其中一个非常好用的组件是PascalScript。这将允许你在事后加载外部脚本,然后根据需要运行它们以与你的应用程序交互。正如Aaron所建议的那样,你仍然需要提供某种接口使你的脚本能够与你的应用程序进行交互。


1

0

我不太确定你所说的“警报”是什么意思,因此我做了一些假设。

1)如果您不需要为警报编写额外的代码,则可以尝试将它们作为数据驱动。将不同类型的警报保存在数据库或配置文件中,这样可以轻松更新现场应用程序而无需重新编译或重新安装。

2)如果每个警报都需要特殊的代码,则可以使用运行时包作为应用程序的插件。搜索Delphi运行时包以获取一些想法和教程。以下是我找到的一些链接:

http://delphi.wikia.com/wiki/Creating_Packages

http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm

3) 脚本编写,正如skamradt所提到的。如果对您的应用程序有意义,这也可以让您的客户在不需要重新编译的情况下编写自己的附加功能。


0
你几乎肯定想使用Pascalscript,正如skamradt所建议的那样。你应该从这里开始,并认真考虑这个选项。能够将实时代码序列化为文本会带来许多可能性。唯一的缺点可能是执行速度较慢,但这可能对你的应用领域并不重要。我本来想给skamradt点赞的,但我没有足够的声望来点赞 :)

0

前段时间我遇到了一个类似于你所描述的情况。

我的解决方案是使用.DLL文件。我将变量代码放在一个.DLL文件中,该文件是动态加载的,名称在配置文件中指定。我传入了一个包含我所知道的所有情况的记录。

在我的情况下,只有成功/失败的返回值,没有屏幕输出,这个方法非常有效。(它控制着一台机器。)


0

这听起来像是一个脚本语言或“特定领域语言”的地方。有几种方法可以实现:

  • 在VBscript中实现警报功能(使用记事本编写的.vbs文件),通过COM API访问您的Delphi代码。使用COM API可以让您访问大量用于编写函数的编程工具,包括Delphi。这是最笨拙的解决方案,但最容易实现。这也可能有助于您的销售过程,考虑如何销售产品总是好的。

  • 在Delphi中实现自己的函数语言。这样,您可以使其变得非常简单,以至于最终用户可以编写自己的警报功能。如果您将其作为表达式求值器,则可以将警报编写为2*T1>T2。有几个表达式求值器可供选择,如果它们不符合您的需求,您也可以编写自己的表达式求值器。

  • 在您的Delphi应用程序中使用预定义的编程语言,例如“Pascal Script”,请参见http://www.remobjects.com/ps.aspx


0
你应该看一下PaxCompiler,类似于PascalScript,它允许加载脚本,但是您甚至可以在更高的性能之前进行预编译。请查看演示部分以解决您的问题。
顺便提一下,网页看起来真的很糟糕,但是这个软件包实际上非常强大和稳定。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接