将现有的 exe 文件嵌入到另一个程序中

Posted

技术标签:

【中文标题】将现有的 exe 文件嵌入到另一个程序中【英文标题】:Embedding an existing exe file into another program 【发布时间】:2010-03-22 23:46:16 【问题描述】:

有没有办法在编译期间将现有的 .exe 文件与其他 C++ 源文件链接?我实际上想要做的是使用 LZMA(7zip) SDK 在我的控制台程序中压缩和解压缩一些文件,但不幸的是对于新手来说很难使用。

有一个名为 7za.exe 的 LZMA 命令行版本,我想知道是否可以将它嵌入到我的程序中并像函数一样使用它。它可以很容易地与 system() 函数一起使用(这似乎是一件非常危险的事情),但是如果我将我的程序发送给在正确文件夹中没有 7za.exe 的人,它将无法工作。

我在 windows.h 头文件中遇到了 CreateProcess() 函数,但它似乎以更适当和更高级的方式实现了 system() 的功能。我不知道它是否真的可以在编译期间像目标文件一样链接 exe文件

【问题讨论】:

如果您询问使用 MS link.exe 或 GNU 的 ld 之类的链接器进行链接,那么它不能。这与 C++ 无关。 您在使用压缩 SDK 时走在了正确的轨道上。不要为此使用外部 exe。请发布您在使用 7zip 时遇到的问题。 【参考方案1】:

CreateProcess() 是一个 Windows API 调用,用于启动一个进程,就像它听起来一样,作为您的程序的子程序,您可以通过知道它是 HANDLE 来控制它。 system() 执行系统命令。这就是你所知道的,我个人不惜一切代价避免使用它——尤其是因为它不可移植(该函数存在于 windows 和 linux 上,但该命令不存在)。

可以将数据附加到 EXE 映像的末尾 - 这就是安装程序的工作方式。看看这个microsoft support article,它奇怪地为您提供了基本代码,但您应该能够轻松地将其转换为 C++。这是creating a self-extractor 上的一篇文章,可能更合适。两者都应该允许您在 exe 中嵌入文件。

我不建议您提取 7za 并从 System()CreateProcess() 调用它 - 我建议您学习 SDK。这很困难,但你会从中学到很多东西。

最后,由于您必须修改现有的 exe 文件,因此您无法在编译时执行此操作。您需要让代码将任何内容添加到它自己的图像或其他图像中。

关于附加到 exe 的 addressing data 的更多详细信息。

【讨论】:

【参考方案2】:

好的,试试这个……

    编写一个命令行实用程序,仅将一个文件复制到另一个文件的末尾。您可以使用 Windows 文件 I/O 或 shell 命令来执行此操作。 执行一个运行此实用程序的构建后步骤。您的程序将以通常的方式完全链接,然后您的实用程序只会将第二个 exe 的字节附加到目标 exe。

这就是链接步骤。现在对 exe 的运行时访问是另一回事。本质上,算法是这样的:

    打开要嵌入到字节级二进制编辑器中的 EXE(msdev.exe 可以)。记下前 30 或 40 个字节作为文件开头的唯一标记。 编写一个函数,打开上面创建的复合文件,并通过查找唯一标记来搜索嵌入文件。 找到嵌入文件的开头后,使用文件 I/O 将该文件的字节复制到第二个新文件。 使用 system() 或类似 API 执行新文件。

如果您以这种方式分发其他人的作品,请正确获取许可。将其他人的二进制文件放入您自己的文件中通常是侵犯版权的行为——当然也有例外。

【讨论】:

以上是关于将现有的 exe 文件嵌入到另一个程序中的主要内容,如果未能解决你的问题,请参考以下文章

如何将附属程序集嵌入到 EXE 文件中

将dll文件嵌入exe程序

在 TIBCO BPM 流程中嵌入版本控制

如何把EXE嵌入到网页中运行?

将一个 Unity .exe 文件嵌入到多个 WPF 页面中

如何在 VC++ exe 程序中嵌入 EXE 文件