Как встроить ресурсы в один исполняемый файл? - PullRequest
7 голосов
/ 15 мая 2011

Если вы когда-либо использовали инструмент Game Maker, это немного похоже на это. Я хочу иметь возможность взять все мои звуки, изображения и все остальное и тому подобное и встроить их в один исполняемый файл C ++. В Game Maker будет встроенный редактор, в который будут встроены изображения в файл .gmk, и когда вы откроете его, он будет читать изображения и отображать их в игре. Я думаю, что он сохранил изображения не как изображения, а как чистые данные, хранящиеся в файле .gmk и интерпретированные редактором или каким-то интерпретатором, записанным в .exe. Как бы я сделал что-то подобное?

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

Система ресурсов Windows работает следующим образом, поэтому, если вы создаете приложение WinAPI или MFC, вы можете использовать это. Кроме того, Qt предоставляет те же функциональные возможности, но независимо от платформы. Они просто записывают файлы в необработанном двоичном формате в байтовый массив в обычном файле C ++, поэтому они компилируются как данные в исполняемый файл. Затем они предоставляют функции для доступа к этим блокам данных, как к обычным файлам, хотя я не знаю, как они на самом деле работают. Возможно, это специальная реализация их класса файлов, которая просто обращается к этим переменным байтового массива.

1 голос
/ 23 апреля 2014

Только для изображений, очень простой подход заключается в использовании формата XPM .

Этот формат является допустимым заголовком C / C ++, поэтому вы можете включить его непосредственно в исходный файл C ++ и использовать его напрямую.

Основная проблема этого подхода заключается в том, что XPM не является сжатым форматом, поэтому использует много места для хранения. Следовательно, на практике я видел, что это используется только для иконок и небольших графических объектов, но в принципе вы могли бы сделать больше.

Еще одна интересная особенность XPM в том, что она удобочитаема человеком - опять же, отлично подходит для создания маленьких и простых иконок.

Чтобы обобщить эту идею для других форматов, вы можете создать цепочку компиляции, которая:

  1. Кодирует целевой файл как ASCII (Uuencode или что-то подобное)
  2. Превращает это в одну строку с именем C в исходном файле.
  3. Создать заголовок, просто объявив имя
  4. Определить функцию, восстанавливающую двоичную форму из строки
0 голосов
/ 13 марта 2019

Для ОС Windows у меня есть решение, если вы хотите использовать другой инструмент и, возможно, фреймворк.Попробуйте «пересембед» инструмент.Он встраивает файлы в разделы 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 };
...