【问题标题】:Embed .exe file into C++ program?将 .exe 文件嵌入到 C++ 程序中?
【发布时间】:2020-10-05 01:16:59
【问题描述】:

我编写了一个 c++ 程序,我想在其中执行我的第二个程序,它是一个 exe 文件。问题是我想将我的程序作为一个文件分享给其他人。

当我在互联网上搜索时,我找到了这个解决方案。

只需将第二个 .exe 文件作为二进制资源存储在主文件中 .exe 在编译时使用 .rc 文件。在运行时,您可以访问它 使用FindResource()LoadResource()LockResource(),然后 在将其传递给system()之前,将其写入磁盘上的临时文件。

但我不明白如何“将 .exe 文件存储为二进制资源”

我目前正在使用CreateProcess() 启动我的第二个程序,该程序运行良好。 谁能帮我写一些例子?

【问题讨论】:

  • 存储它应该与存储任何其他二进制资源没有什么不同。但是,您可能需要将文件解压缩到硬盘驱动器上的某个位置才能使用它。
  • 您在使用 Visual Studio 吗?您的项目中有资源脚本(.rc 文件)吗?你了解如何使用资源编辑器吗?如果我们要适当地提供有用的解决方案,我们需要更多信息。
  • @drescherjm 您好,感谢您的帮助。所以我可以将 .exe 重命名为 .rc?..
  • 所以我可以将 .exe 重命名为 .rc 吗? 不可以,但可以在 .rc 文件中添加二进制资源。跨度>
  • @AdrianMole 嗨,我正在使用 Cygwin,因为我在我的程序中使用了一些 Linux 库。我不知道如何使用资源编辑器。

标签: c++ windows cygwin exe embed


【解决方案1】:

在您项目的资源脚本(定义图标、对话框等的.rc 文件)中,您可以添加具有如下行的二进制资源:

IDB_EMBEDEXE    BINARY      "<path>\\EmbedProgram.exe"

IDB_EMBEDEXE 令牌/宏应该在一个头文件中定义,该头文件由两个该资源脚本任何使用 ( s) 它;这将是给FindResource() 调用的lpName 参数,您可以使用MAKEINTRESOURCE(IDB_EMBEDEXE) 形成该参数。为 lpType 参数指定 "BINARY"(或 L"BINARY" 用于 Unicode 构建)。

像这样:

#define IDB_EMBEDEXE 13232 // Or whatever suitable value you need
//...
// In the C++ code:
HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDB_EMBEDEXE), _TEXT("BINARY"));
HGLOBAL hGlobal = LoadResource(NULL, hResource);
size_t exeSiz = SizeofResource(NULL, hResource); // Size of the embedded data
void*  exeBuf = LockResource(hGlobal);           // usable pointer to that data

// You can now write the buffer to disk using "exeBuf" and "exeSiz"

然后,指定的可执行文件将完全嵌入(作为二进制)资源到您的 built 可执行文件中,并且可以按照您引用的文章中的描述进行提取、写入磁盘和执行。

【讨论】:

  • 非常感谢您的回答,我正在努力理解它。
  • 通过将RT_RCDATA 更改为"BINARY"FindResource() 返回一个句柄,因此它可以工作。
  • MAKEINTRESOURCE(RT_RCDATA) 给我错误:从'LPSTR' {aka'char*'} 转换为'WORD' {aka'short unsigned int'}
  • 您好,非常感谢您的帮助。它在我的 Windows 10 PC 上运行流畅。最近,我在 Windows 7 计算机上尝试了相同的程序,当 WriteFile( hFile, exeBuf, exeSiz, NULL , NULL); 时它崩溃了。这是怎么回事?我在 Windows 10 上没有遇到任何问题。谢谢
  • 我通过将NULL 更改为&amp;at Reference 解决了这个问题。顺便说一句,谢谢
猜你喜欢
  • 2017-09-04
  • 2011-01-10
  • 2010-11-30
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多