【问题标题】:Embedding an existing exe file into another program将现有的 exe 文件嵌入到另一个程序中
【发布时间】: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 时遇到的问题。

标签: system exe createprocess


【解决方案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】:

    好的,试试这个……

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 2020-10-05
      • 2010-11-30
      • 2017-12-17
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      相关资源
      最近更新 更多