如何将资源嵌入到单个可执行文件中?

问题描述:

如果你曾经使用过这个工具,那就有点像这样。我希望能够将我的所有声音,图像和其他所有内容都嵌入到一个C++可执行文件中。 Game Maker会有一个内置的编辑器,并将图像嵌入到.gmk文件中,当您打开它时,它会读取图像并将其显示在游戏中。我认为他将图像保存为图像,而不是保存在.gmk文件中的纯数据,由编辑器解释或由解释器写入.exe。我会如何去做类似的事情?如何将资源嵌入到单个可执行文件中?

Windows资源系统是这样工作的,所以如果你制作一个WinAPI或MFC应用程序,你可以使用它。而且,Qt提供了相同的功能,但是采用平*立的方式。他们只是以原始二进制格式将文件写入正常C++文件中的字节数组中,以便将它们作为数据编译到exe中。然后他们提供访问这些数据块的功能,如普通文件,尽管我不知道它们是如何工作的。可能是它们的文件类的特殊实现,它只是访问这些字节数组变量。

+0

非常有趣恢复二进制形式。我想这只是另一个微软的东西,比如directX或者WinAPI。功能非常有用,但不是跨平台。但很高兴看到QT具有类似的功能。 – Keelx 2011-05-15 03:44:27

+0

MSDN的使用资源(Windows):https://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx – Andrew 2017-01-28 05:16:13

仅用于图像,一个非常简单的方法是使用XPM格式。

此格式是一个有效的C/C++头文件,因此您可以将其直接包含到C++源文件中并直接使用它。

这种方法的主要问题是XPM不是压缩格式,因此使用了大量存储空间。 因此,实际上我只看到它用于图标和小图形对象,但原则上你可以做更多。

关于XPM的另一件很酷的事情是,它是人类可读的 - 对于设计小而简单的图标来说也很棒。

为了推广这一理念为其它格式,你可以做的是创造一个编译链是:

  1. 编码上述目标文件作为ASCII(的Uuencode或如)
  2. 打开该成一个单一命名C源文件中的字符串。
  3. 创建标题只是声明名称
  4. 定义一个函数从字符串