【发布时间】:2012-03-13 03:07:27
【问题描述】:
我有一个使用 DLL“program.dll”的外部命令行可执行文件“program.exe”。我想将这两个文件作为资源嵌入到我的 Qt 应用程序中。然后,我需要能够从我的应用程序中运行 program.exe。可以用Qt完成吗?特别是,可执行文件和 DLL 可以作为资源添加吗?
【问题讨论】:
标签: qt dll resources executable
我有一个使用 DLL“program.dll”的外部命令行可执行文件“program.exe”。我想将这两个文件作为资源嵌入到我的 Qt 应用程序中。然后,我需要能够从我的应用程序中运行 program.exe。可以用Qt完成吗?特别是,可执行文件和 DLL 可以作为资源添加吗?
【问题讨论】:
标签: qt dll resources executable
您可以将它们作为资源添加,但您将无法直接从资源中执行“program.exe”,因为这是一个底层操作系统无法理解的纯 Qt 系统。
您需要在执行时将其(使用 .dll)从资源复制到临时位置并从那里执行。
显然,正如@webclectic 指出的那样,这不是一个正确的方法。除非有绝对的理由这样做,否则正确的方法是使用这些可执行文件创建一个包(.msi、.rpm,具体取决于目标操作系统)并以这种方式部署它们。
【讨论】:
具体来说,可执行文件和 DLL 可以作为资源添加吗?
是的,他们可以,如果您将可执行文件添加到 qrc 文件,您会注意到 Qt 应用程序的大小将随着添加的资源可执行文件的大小而增加。
但是你真的想做这样的事情吗?我从未尝试过做类似的事情,但我怀疑这是否可能。系统将无法从您的资源中读取可执行文件。可执行文件的执行是系统特定的,系统需要能够找到要执行的文件。我想在您的应用程序启动时,您可以将可执行文件复制到临时目录并从那里调用它。在应用程序退出时,您应该删除这些文件。
我个人不会采用这种方法。创建一个可以复制应用程序文件夹中所有必要的可执行文件/dll的安装程序要简单得多(恕我直言)。
【讨论】:
二进制文件可以作为资源添加,并且像其他人所说的那样提取到临时位置以从那里执行。这类似于自解压安装程序的工作方式。
但是,也可以直接使用它们,而无需通过编写自定义 DLL 加载器将它们保存到临时位置。
我不确定,但我认为可执行文件可以以相同的方式加载并通过分叉启动。但我认为与直接从硬盘驱动器启动相比,生成的过程会有所不同。
我已经看到了完全执行此操作的应用程序的源代码,但它并不重要,并且需要了解低级内容。如果有人对如何实现这一点有很好的资源,请添加它们。
【讨论】: