1

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

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

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

4

2 回答 2

4

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

可以将数据附加到 EXE 映像的末尾 - 这就是安装程序的工作方式。看看这篇微软支持文章,它奇怪地为您提供了基本代码,但您应该能够轻松地将其转换为 C++。这是一篇关于创建可能更合适的自提取器的文章。两者都应该允许您在 exe 中嵌入文件。

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

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

有关附加到 exe的寻址数据的更多详细信息。

于 2010-03-22T23:58:30.287 回答
1

好吧,试试这个...

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

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

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

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

于 2010-03-22T23:58:55.357 回答