需要创建一个已编译的Delphi应用程序,可以生成一个单独的已编译应用程序。

3
我需要制作一个应用程序,让用户选择一些选项,点击按钮后,将创建一个单独的编译应用程序。这可能吗?我正在使用Delphi 7和2010。
谢谢回复。这里有更多信息。
它必须是一个图形化应用程序并创建一个图形化应用程序。
我的想法是让用户启动“应用程序A”(我最初制作的),能够选择一些选项(我对保密表示歉意。我认为这是一个价值百万美元但可能只有3个人会发现有用的想法:)然后使用程序创建“应用程序B”。'应用程序B'随后可以分发给最终用户,并且'应用程序B'是包含已编译应用程序及配置数据的单个可执行文件。我不在乎方法,但我需要'应用程序B'是一个单个可执行文件。
我甚至不需要为最终编译的应用程序使用Delphi。如果有某种“伪编译器”可以从Delphi调用,并将预编译的exe和单独的配置文件合并到一个单个的可执行文件中。那也可以正常工作。
感谢回复和帮助。
谢谢。

如果您需要为第二个应用程序生成代码:我在DelphiLive!上做了一个关于这些事情的演示,下周初回到荷兰后,我会上传演示源代码。 - Jeroen Wiert Pluimers
你应该解释一下你想要创建什么类型的应用程序。控制台/图形用户界面,简单/复杂等等? - splash
3
请记住,Delphi编译器及其库不能被分发。用户需要拥有合法的Delphi拷贝,或者你需要自己编写编译器(和库)。要保持原意,同时使翻译通俗易懂。 - user160694
需要哪种选项?您是否真的需要发出不同的代码,或者如果您只是将选项硬编码到应用程序中,并且应用程序对这些值做出反应,那么是否足够?换句话说,您是否需要编译它 - Lasse V. Karlsen
Karlson,我不需要一个已编译的应用程序,但我确实需要一个单独的可执行文件。因此,如果有一种将exe与配置文件合并为单个exe的方法,那就太好了。如果可能的话。谢谢。 - David
5个回答

6
我曾经也遇到过类似的情况。我需要使用我的exe来生成一个exe文件。但是由于编译源代码的复杂性和许可问题,我不想这样做。
我们把父应用程序称为P,子应用程序称为C。还假设C所需的任何选项都可以在配置文件(XML/INI等)中总结出来。我最终做的是:
1. 创建P和C,并将C插入P的资源数据中。 2. 当用户选择选项后单击按钮,P会从其资源数据中提取C。 3. 创建一个包含用户选择的选项的XML文件,并将其插入到C的资源数据中。
因此,每当C运行时,它将使用嵌入在其中的XML文件中给出的选项。这看起来很复杂和hacky,但是可靠而简单。在谷歌上搜索“Delphi嵌入资源到exe”即可找到大量相关文章。

2
如果您可以涵盖所有选项,这是一个不错的选择。在大多数情况下都是可行的。虽然不是他要求的,但这是一个好建议和一个好的替代方案。 - Runner
1
@Runner,David 没有说他需要能够编译源代码。他说他需要生成一个已编译的应用程序。如果他从一个已编译的应用程序开始,复制它并修改其资源部分,那么他最终将得到另一个已编译的应用程序,正是他所要求的。我怀疑 David 的意思不是让其他人推断出程序需要在用户现场编译,特别是当他没有提到任何代码生成和唯一的用户输入是“选择一些选项”时。 - Rob Kennedy
好的。我的要求是用户启动“应用程序A”,能够选择一些选项(我为保密道歉。我认为这可能是一个价值百万美元的想法,可能只有3个人会发现它有用:)然后使用该程序创建“应用程序B”。然后可以将“应用程序B”分发给最终用户,“应用程序B”是一个包含编译应用程序和配置数据的单个可执行文件。我不在乎如何实现,但我需要“应用程序B”成为一个单个可执行文件。感谢回复和帮助。 - David
@Rob,我看你说得对。英语不是我的母语,所以我忽略了那个。还是我应该看的更仔细 :) - Runner
@David,请看一下UpdateResource API函数。 - Rob Kennedy

2
可以实现。您需要在目标计算机上拥有 Delphi 7(或兼容)编译器(至少是命令行)。如果使用了任何第三方库,则还需要所有编译应用程序的源代码。

当您准备就绪后,只需使用正确的参数和路径调用命令行编译器(DCC32.EXE)即可。

您可以使用两种方法:

  • 调用 ShellExecute
  • 调用 CreateProcess

使用 CreateProcess 可以更好地控制执行过程。此外,如果您打算以这种方式使用编译器,则需要注意法律问题和许可证问题。


2

考虑到Delphi编译器不能被重新分发,如果用户没有Delphi的副本,则一种解决方案是使用脚本引擎(例如RemObjects PascalScript等其他引擎),为其生成代码,并将该代码嵌入可执行文件中(例如在资源中),以便在启动时执行它。


PaxCompiler 可以编译可执行文件甚至包,值得一试。 - user219760

2

创建一个单独的存根可执行文件,实现您所需的所有逻辑,并从其自己的本地资源中读取配置(请查看TResourceStream类以帮助您在运行时加载资源)。

在编译主应用程序时,将该存根可执行文件作为RCDATA资源包含在其中。

在运行时,当需要时,主应用程序可以从其资源中提取存根可执行文件,保存到磁盘并使用Win32 API UpdateResource()函数向存根的资源中插入必要的配置数据。


0

如果你没有更多关于为什么你认为需要这样做的信息,我猜你实际上并不需要这样做。根据所述要求,我会简单地编写一个使用 Delphi 编写的应用程序,在寻找配置数据(.ini文件、注册表等)的存在情况下运行。在缺少配置数据的情况下,它将呈现一个屏幕,“让用户选择一些选项,然后点击一个按钮”。然后将这些选项存储在一个 .ini 文件中,并使用这些选项执行程序的其余部分。

另外,我可以使用一些像 TMS 提供的帕斯卡脚本。

如果你正在寻找一种生成定制品牌版本应用程序的方法,也许可以使用 Inno Setup 和 ResHacker 步骤。例如,在 Inno 中收集要求,将 .exe 输出到临时目录,使用 ResHacker 修改 .exe,将其复制到程序文件夹中。


谢谢您的回复。我可能不需要创建第二个可执行文件,但我需要以某种方式将配置文件包含在可执行文件中。 - David
1
@David,那么 ResHacker 可能适合你。即将配置作为资源字符串注入到 .exe 文件中。 - Chris Thornton
真的必须嵌入式的吗?还是可以使用加密配置文件来防止篡改呢? - Mattl

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