C++ 将外部 .exe 嵌入到我编译的 .exe 中
Posted
技术标签:
【中文标题】C++ 将外部 .exe 嵌入到我编译的 .exe 中【英文标题】:C++ Embed external .exe into my compiled .exe 【发布时间】:2013-05-25 05:17:51 【问题描述】:我对一个我很陌生的话题有一个简短的问题。我有一个我制作的程序,它向我称为“工具”的文件夹中的另一个 .exe 发送命令。我以这种格式发送:
system("tools\\program.exe -r -w file.dat file_new.dat");
一切都很好,但是,当我将我的程序构建为 .exe 时,显然它需要另一个可执行文件位于第二个文件夹中。有什么办法可以将外部 .exe 包含到我的项目中,这样最终产品就只有一个 .exe?
我正在使用 Visual Studio 2008 (lol) 并运行 windows 7 64 位。
谢谢:)
【问题讨论】:
【参考方案1】:通常,外部依赖项的管理将由安装程序处理。 NSIS 是我最喜欢的 Windows 平台解决方案。
替代方案:将二进制文件转换为 base64 编码并将其作为头文件嵌入到您的项目中。运行应用程序时,将 exe 的 base64 表示形式转换为二进制序列,然后将该字节序列输出到临时目录中的文件(如 C:\windows\temp 或 %AppData%\Local\Temp)。然后运行exe。完成后,删除 exe。
【讨论】:
所以我需要制作一个安装程序吗?我觉得有一些方法可以将它添加为资源或其他东西。我希望能够只向某人发送一个 .exe 文件。我也不希望用户能够获得外部 .exe 的副本,这就是我想要嵌入它的原因。 不,你不需要,但替代方案要复杂得多,NSIS 会生成一个快速且压缩的 exe 文件 如果 exe 不是您应该分发的东西,那么无论您是嵌入到安装程序还是核心二进制文件中都没有关系。对不起,如果这是一个迂腐的答案,但这是事实 是否可以将其解压缩到他们无法轻松访问的文件夹/地方?也许与RAM有关?还是具有特定权限的文件夹? @GearoidMurphy:采用 base64 方法太过分了,更不用说浪费内存和运行时处理了。只需在编译时使用 .rc 文件将第二个 .exe 文件作为二进制资源存储在主 .exe 中。在运行时,您可以使用FindResource()
、LoadResource()
和LockResource()
访问它,然后将其写入磁盘上的临时文件,然后再将其传递给system()
。【参考方案2】:
您可以将文件添加到资源中。在执行命令之前,您可以检查第二个可执行文件是否存在。如果不存在,则必须从资源中提取数据并存储到文件中...
This thread 正在处理从资源中读取 html。与二进制文件非常相似。
【讨论】:
以上是关于C++ 将外部 .exe 嵌入到我编译的 .exe 中的主要内容,如果未能解决你的问题,请参考以下文章