【问题标题】:How to add code inside a program in runtime (Delphi/Windows)?如何在运行时(Delphi/Windows)的程序中添加代码?
【发布时间】:2009-10-13 15:13:13
【问题描述】:

我正在使用 Windows XP/Delphi 7。我需要在正在运行的程序中添加一些过程(或函数),并且我不想在完成后再次重新编译它。

我只有一个主机应用程序,它有 5 个功能来发送不同类型的警报,但是还有其他新的警报类型,所以我必须做新的功能来发送这些警报,但我不应该重新构建主机应用程序。我有一个名为 TAlarmManager 的类,它调用这些函数。

也许是一个插件??好的,但是我怎样才能“插入”新功能???教程、手册、书籍等。用于了解此内容,或有关如何执行此操作的任何建议???

我研究过插件(我对这个主题完全陌生),但没有人“谈论”向主机应用程序添加功能。在我看来,插件是从自身添加功能的,我的意思是,它们是用自己的代码开发的,而不是向宿主应用程序“添加”代码......我该怎么做??

【问题讨论】:

    标签: delphi


    【解决方案1】:

    对于技术方面:Delphi IDE 是如何做到的?那将是我首先要看的地方。

    要了解插件,您必须了解您不能添加新功能。你可以,但由于旧代码不知道如何调用它,它们不会被调用。

    所以你要做的就是为你的插件添加一个“注册”或“启动”功能。该启动函数获取一个数据结构作为它可以检查或扩展的参数。在您的情况下,这将是警报列表。警报总是一样的(我猜),所以它可以添加额外的警报。

    在注册所有插件后,主代码将遍历警报列表并在每个插件上调用标准警报功能。它不再关心每个警报的来源和实际作用。

    这里的关键:你需要定义一个双方订阅的接口。主代码调用接口函数,你的插件代码实现它们。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        另请参阅 Stackoverflow 上的 Plugins system for Delphi application - bpl vs dll?

        【讨论】:

          【解决方案4】:

          我不太清楚你所说的“警报”是什么意思,所以我做了几个假设。

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

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

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

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

          3) 脚本,正如 skamradt 已经提到的。如果它对您的应用程序有意义,这也可以让您的客户编写自己的附加功能,而无需您重新编译。

          【讨论】:

            【解决方案5】:

            正如 skamradt 建议的那样,您几乎肯定想要使用 Pascalscript。你应该从这里开始,认真考虑这个选项。能够将实时代码序列化为文本有很多可能性。唯一的缺点可能是执行速度,但这对您的应用程序域可能无关紧要。我会投票赞成 skamradt,但我没有足够的声誉来投票 :)

            【讨论】:

              【解决方案6】:

              不久前,我正在研究一种类似于您所描述的情况。

              我的答案是 .DLL。我将变量代码放在动态加载的 .DLL 中,名称在配置文件中指定。我传递了一份记录,其中包含我所知道的有关情况的所有信息。

              在我的情况下,只有成功/失败返回,没有屏幕输出,这工作得很好。 (它正在指挥一台机器。)

              【讨论】:

                【解决方案7】:

                这听起来像是脚本语言或“域特定语言”可能有意义的地方。有几种方法可以解决这个问题:

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

                • 在 Delphi 中实现您自己的函数语言。通过这种方式,您可以轻松完成,最终用户可以编写自己的警报函数。如果您作为表达式评估器执行此操作,则可以将警报编写为 2*T1>T2。那里有几个表达式评估器,如果它们不符合您的需求,您也可以编写自己的。

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

                【讨论】:

                  【解决方案8】:

                  你应该看看PaxCompiler,就像 PascalScript 它允许加载脚本,但你甚至可以在之前预编译它们以获得更高的性能。查看演示部分以解决您的问题。

                  顺便说一句,网页看起来确实很糟糕,但该软件包确实强大且稳定。

                  【讨论】:

                    【解决方案9】:

                    我认为脚本解决方案非常适合这种情况。
                    您可以评估许多脚本包:

                    问候。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-06-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-12-19
                      相关资源
                      最近更新 更多