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

时间:2011-05-14 23:44:24

标签: c++ resources embed game-maker

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

3 个答案:

答案 0 :(得分:2)

Windows资源系统的工作方式如下,因此如果您创建WinAPI或MFC应用程序,则可以使用此方法。此外,Qt提供相同的功能,但以独立于平台的方式。他们只是将原始二进制格式的文件写入普通C ++文件中的字节数组中,因此它们作为数据编译到exe中。然后他们提供访问这些数据块的功能,如普通文件,虽然我不知道它们是如何工作的。可能是他们的文件类的特殊实现,它只访问那些字节数组变量。

答案 1 :(得分:1)

仅限图片,一种非常简单的方法是使用XPM格式。

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

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

关于XPM的另一个很酷的事情是,它是人类可读的 - 再次非常适合设计小而简单的图标。

要将这个想法概括为其他格式,您可以做的是创建一个编译链:

  1. 将目标文件编码为ASCII(Uuencode等)
  2. 将其转换为源文件中的单个命名C字符串。
  3. 创建一个标题,只声明名称
  4. 定义从字符串
  5. 恢复二进制形式的函数

答案 2 :(得分:0)

对于Windows操作系统,如果您愿意使用其他工具和可能的框架,那么我有一个解决方案。试试“ peresembed”工具。它将文件嵌入PE图像部分,因此您可以将所有图像,声音和配置文件存储在一个EXE文件中。尽管您确实需要一个ZIP内存读取框架,但它也支持压缩。甚至可以根据文件的相对文件路径将文件嵌入PE资源树中。

用法示例:

peresembed -file content.txt _export_to_resolve input.exe output.exe

在您的C ++文件中,您具有:

struct embedded_data
{
    void *dataloc;
    size_t datasize;
};

extern "C" __declspec(dllexport) const volatile embedded_data _export_to_resolve = { 0 };