2010-03-22 115 views
1

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

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

我在Windows.h头文件中遇到了CreateProcess()函数,但它似乎以更合适和更高级的方式实现了system()。我不知道,如果它实际上可以链接编译

+0

如果您要求使用链接器如MS link.exe或GNU的ld进行链接,那么不可以。这与C++无关。 – 2010-03-22 23:55:44

+1

您正在使用压缩SDK进入正确的轨道。不要为此使用外部exe文件。请发布您使用7zip的问题。 – kervin 2010-03-23 00:01:52

回答

3

CreateProcess()中像一个对象文件中的exe文件是Windows API调用来启动一个进程,正是因为它听起来像,作为你的程序的孩子,你可以通过知道它的控制HANDLEsystem()执行系统命令。这与你所知道的一样多,我个人不惜一切代价避免使用它 - 不仅是因为它不是可移植的(该功能存在于Windows和Linux上,但命令不会)。

可以将数据附加到EXE映像的末尾 - 这是安装程序的工作方式。看看这个microsoft support article,它奇怪地给你基本的代码,但你应该能够把它变成C++。这里有一篇关于creating a self-extractor的文章,可能更适合。两者都应该允许你在exe文件中嵌入文件。

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

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

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

1

好了,试试这个...

  1. 写命令行实用程序,只是将文件复制到另一个终点。你可以用Windows文件I/O或shell命令来做到这一点。
  2. 进行后期构建步骤以运行此实用程序。您的程序将完全链接通常的方式,然后您的实用程序将仅将第二个exe的字节附加到目标exe。

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

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

如果您以这种方式分发别人的工作,请获得正确的许可。一般来说,将其他人的二进制文件放入你自己的版本中是有侵犯版权的 - 当然也有例外。

相关问题