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

时间:2010-03-22 23:46:16

标签: system exe createprocess

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

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

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

2 个答案:

答案 0 :(得分:3)

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的更多细节。

答案 1 :(得分:1)

好的,试试这个......

  1. 编写一个命令行实用程序,它只将一个文件复制到另一个文件的末尾。您可以使用Windows文件I / O或shell命令执行此操作。
  2. 制作运行此实用程序的构建后步骤。你的程序将完全链接通常的方式,然后你的实用程序只会将第二个exe的字节附加到目标exe。
  3. 这是连接步骤。现在,对exe的运行时访问是另一回事。基本上,算法是这样的:

    1. 打开EXE以嵌入字节级二进制编辑器(msdev.exe可以)。记下前30或40个字节作为文件开头的唯一标记。
    2. 编写一个函数,打开上面创建的复合文件,并通过查找唯一标记来搜索嵌入文件。
    3. 找到嵌入文件的开头后,使用文件I / O将该文件的字节复制到第二个新文件。
    4. 使用system()或类似的API执行新文件。
    5. 如果您以这种方式分发其他人的工作,请获得正确的许可。将别人的二进制文件扔进自己的版本通常是侵犯版权 - 当然也有例外。