Как добавить файл в ресурсы c

Обновлено: 03.07.2024

Использование ресурсов

Вы также можете обратиться к Приложениям в конце этого руководства для получения дополнительной информации о ресурсах с VC++ и BC++.

Прежде чем мы углубимся в тему, я расскажу о ресурсах, чтобы мне не пришлось переписывать ее для каждого раздела. На самом деле вам не нужно компилировать материал в этом разделе, это только пример.

Ресурсы – это предварительно определенные биты данных, хранящиеся в двоичном формате внутри вашего исполняемого файла. Вы создаете ресурсы в сценарии ресурсов, файле с расширением «.rc». коммерческие компиляторы будут иметь визуальный редактор ресурсов, который позволит вам создавать ресурсы без ручного редактирования этого файла, но иногда его редактирование — единственный путь, особенно если ваш компилятор не имеет визуального редактора, он отстой или не поддерживает точную функцию вам нужно.

К сожалению, разные наборы компиляторов по-разному обрабатывают ресурсы. Я сделаю все возможное, чтобы объяснить общие функции, необходимые для работы с ресурсами в целом.

Редактор ресурсов, входящий в состав MSVC++, очень затрудняет редактирование ресурсов вручную, поскольку он применяет к ним проприетарный формат и полностью искажает файл, если вы сохраните файл, созданный вручную. Как правило, вам не следует создавать файлы .rc с нуля, но знание того, как изменять их вручную, может быть очень полезным. Еще одна неприятность заключается в том, что MSVC++ по умолчанию называет файл заголовка ресурса «resource.h», даже если вы хотите назвать его как-то иначе. Я буду использовать это для простоты в этом документе, но покажу вам, как изменить это в приложении по компиляторам.

Сначала давайте возьмем очень простой ресурсный скрипт с одним значком.

Это весь файл. IDI_MYICON — это идентификатор ресурса, ICON — это тип, а «my_icon.ico» — это имя внешнего файла, который его содержит. Это должно работать на любом компиляторе.

Как видите, мы присвоили IDI_MYICON значение 101 . Мы могли бы просто забыть об идентификаторе и использовать 101 везде, где нам нужно сослаться на значок, но IDI_MYICON намного понятнее в отношении того, что вы имеете в виду, и его легче запомнить, когда у вас много ресурсов.

Теперь допустим, что мы добавляем ресурс MENU: снова IDR_MYMENU — это имя ресурса, а MENU — его тип. Теперь тонкий момент, видите НАЧАЛО и КОНЕЦ там? Некоторые редакторы ресурсов или компиляторы используют < вместо BEGIN и > вместо END . Если ваш компилятор поддерживает оба, не стесняйтесь выбирать, какой из них вы используете. Если он поддерживает только одно или другое, вам потребуется внести необходимые замены, чтобы заставить его работать.

Мы также добавили новый идентификатор ID_FILE_EXIT , поэтому нам нужно добавить его в файл заголовка нашего ресурса, resource.h, чтобы использовать его в нашей программе.

Создание и отслеживание всех этих идентификаторов может стать настоящей рутиной в больших проектах, поэтому большинство людей используют визуальный редактор ресурсов, который позаботится обо всем этом за вас. Они по-прежнему время от времени дают сбои, и вы можете столкнуться с несколькими элементами с одинаковым идентификатором или похожей проблемой, и хорошо иметь возможность пойти и исправить это самостоятельно.

Теперь пример того, как использовать ресурс в вашей программе. Первым параметром LoadIcon() и многих других функций, использующих ресурсы, является дескриптор текущего экземпляра (который мы задаем в WinMain() и также можем получить с помощью GetModuleHandle(), как показано в предыдущих разделах). Второй — идентификатор ресурса.

LoadIcon() и другие API-интерфейсы загрузки ресурсов могут определить разницу между переданным целым числом и указателем на переданную строку, проверив старшее слово значения. Если он равен 0 (как в случае любого целого числа со значением меньше или равным 65535), предполагается, что это идентификатор ресурса. Это эффективно ограничивает ваши ресурсы использованием идентификаторов ниже 65535, что не должно быть проблемой, если у вас нет большого количества ресурсов. Если это не 0, то предполагается, что значение является указателем, и ищет ресурс по имени. Никогда не полагайтесь на API для этого, если это явно не указано в документации.

Добавление ресурсов в проект и использование представления ресурсов.

Использование шаблона ресурса для создания настраиваемых ресурсов.

Использовать файлы сценариев ресурсов

Прежде чем создавать и добавлять в проект новые ресурсы, необходимо сначала создать файл сценария ресурсов (.rc).

Вы можете добавить файл сценария ресурсов только в существующий проект, загруженный в интегрированную среду разработки Visual Studio. Вы не можете создать автономный сценарий ресурсов вне проекта, хотя файлы шаблонов ресурсов (.rct) можно создавать в любое время.

Чтобы создать файл сценария ресурса

Перенесите фокус на существующую папку проекта в обозревателе решений, например, MyProject.

Не путайте папку проекта с папкой решения в обозревателе решений. Если вы переместите фокус на папку «Решение», у вас не будет тех же вариантов «Добавить новый элемент».

В меню выберите Проект > Добавить новый элемент.

Выберите папку Visual C++ и выберите Файл ресурсов (.rc) на правой панели.

Укажите имя для файла сценария ресурса в текстовом поле "Имя" и выберите "Открыть".

Чтобы открыть файл сценария ресурса

Вы можете просматривать ресурсы в файле сценария ресурсов, не открывая проект. Файл сценария открывается в окне документа, а не в представлении ресурсов.

Некоторые команды доступны только в том случае, если файл открыт автономно, то есть вне проекта без предварительной загрузки проекта. Например, чтобы использовать команду «Сохранить как» и сохранить файл в другом формате или с другим именем, этот файл необходимо открыть отдельно.

Чтобы открыть файл сценария ресурса вне проекта, в меню выберите «Файл» > «Открыть» и выберите «Файл». Перейдите к файлу сценария ресурсов, выделите файл и нажмите кнопку «Открыть».

Возможны случаи, когда вы хотите просмотреть содержимое файла скрипта ресурса вашего проекта, не используя редакторы ресурсов для открытия ресурса. Например, вы можете искать строку во всех диалоговых окнах в файле ресурсов, не открывая каждое из них отдельно. Вы можете легко открыть файл ресурсов в текстовом формате, чтобы просмотреть все содержащиеся в нем ресурсы и выполнить глобальные операции, поддерживаемые текстовым редактором.

Чтобы открыть файл сценария ресурсов в текстовом формате, используйте стрелку раскрывающегося списка справа от кнопки "Открыть" на шаге выше и выберите "Открыть с помощью". Выберите «Редактор исходного кода (текст)» и в раскрывающемся списке «Открыть как» выберите «Текст», и ресурс откроется в редакторе исходного кода.

Чтобы открыть несколько сценариев ресурсов, выполните описанные выше действия для каждого файла, который вы хотите открыть, например Source1.rc и Source2.rc. Затем, когда оба файла .rc открыты в отдельных окнах документов, либо используйте меню «Окно», либо щелкните правой кнопкой мыши один из файлов и выберите «Новая горизонтальная группа вкладок» или «Новая вертикальная группа вкладок». Теперь окна расположены мозаикой, поэтому вы можете просматривать их одновременно.

Вы можете открыть файлы сценариев ресурсов, щелкнув правой кнопкой мыши файл .rc в обозревателе решений, выбрав Открыть с помощью и выбрав Редактор исходного кода (текстовый).

При создании приложения Microsoft Foundation Class (MFC) для Windows с помощью мастера приложений MFC мастер создает базовый набор файлов, включая файл сценария ресурсов (.rc), который содержит основные функции MFC. Однако эти специфичные для MFC функции недоступны при редактировании RC-файла для приложений Windows, не основанных на MFC. Сюда входят мастера кода, строки подсказок меню, содержимое списков для элементов управления полем со списком и размещение элементов управления ActiveX.

Чтобы добавить поддержку MFC, при открытом файле сценария ресурсов в представлении ресурсов выделите папку ресурсов (например, MFC.rc). Затем в окне свойств установите для режима MFC значение True.

Помимо настройки режима MFC, файл .rc должен быть частью проекта MFC. Только установка для режима MFC значения True для RC-файла в проекте Win32 не даст вам возможностей MFC.

Создать ресурсы

Вы можете создать ресурс как новый ресурс по умолчанию, то есть ресурс, который не основан на шаблоне, или как ресурс, построенный по образцу шаблона.

Используйте окно просмотра ресурсов для отображения файлов ресурсов, включенных в ваши проекты. Если развернуть верхнюю папку, например Project1.rc, отобразятся типы ресурсов в этом файле. Разверните каждый тип ресурсов, чтобы отобразить отдельные ресурсы этого типа.

Чтобы открыть окно просмотра ресурсов, перейдите в меню "Просмотр" > "Другие окна" > "Просмотр ресурсов" или нажмите Ctrl+Shift+E.

Вы также можете щелкнуть правой кнопкой мыши окно просмотра ресурсов, чтобы запустить контекстное меню команд, или дважды щелкнуть строку заголовка, чтобы закрепить и открепить окно. Щелкните правой кнопкой мыши строку заголовка для команд, управляющих поведением окна. Дополнительные сведения см. в разделе Управление Windows.

Окна просмотра ресурсов содержат диалоговое окно "Добавить ресурс" со следующими свойствами для добавления ресурсов в проект настольного приложения C++ для Windows:

Вы можете развернуть категории ресурсов курсора и диалогового окна, чтобы открыть дополнительные ресурсы, расположенные в папке ..\Microsoft Visual Studio \VC\VCResourceTemplates\\mfc.rct. Если вам нужно добавить файлы .rct, поместите их сюда или укажите другой путь включения. Ресурсы, отображаемые на верхнем уровне древовидного элемента управления, являются ресурсами по умолчанию, предоставляемыми Visual Studio. Ресурсы в файлах .rct отображаются на втором уровне в соответствующей категории. Количество добавляемых файлов .rct не ограничено.

При создании нового ресурса Visual C++ присваивает ему уникальное имя, например, IDD_Dialog1 . Вы можете настроить этот идентификатор ресурса, изменив свойства ресурса либо в соответствующем редакторе ресурсов, либо в окне свойств.

Не указывайте имя или идентификатор ресурса, зарезервированные Visual Studio.Зарезервированные имена — DESIGNINFO , HWB и TEXTINCLUDE , а зарезервированный идентификатор — 255 .

Чтобы создать ресурс

В представлении ресурсов выберите файл .rc, затем нажмите «Правка» > «Добавить ресурс» и выберите тип ресурса, который нужно добавить в проект.

Вы также можете щелкнуть правой кнопкой мыши файл .rc в представлении ресурсов и выбрать "Добавить ресурс" в контекстном меню.

В обозревателе решений щелкните правой кнопкой мыши папку проекта, выберите "Добавить" > "Добавить ресурс" и выберите тип ресурса, который нужно добавить в проект.

Если в вашем проекте еще нет файла .rc, на этом шаге он будет создан. Затем вы можете повторить этот шаг, чтобы добавить определенные типы ресурсов в новый файл .rc.

В представлении класса щелкните проект правой кнопкой мыши, выберите "Добавить" > "Добавить ресурс" и выберите тип ресурса, который нужно добавить в проект.

Используйте меню Проект > Добавить ресурс.

Использовать шаблоны ресурсов

Шаблон ресурса – это настроенный ресурс, который вы сохранили в виде файла .rct. Затем шаблон ресурса служит отправной точкой для создания ресурсов. Шаблоны ресурсов экономят время при разработке дополнительных ресурсов или групп ресурсов с общими функциями, такими как стандартные элементы управления или повторяющиеся элементы. Например, если вы хотите включить кнопку справки со значком логотипа компании в несколько диалоговых окон, создайте новый шаблон диалогового окна и настройте его с помощью кнопки справки и логотипа.

После настройки шаблона ресурса сохраните изменения в папке шаблона или в месте, указанном в пути включения, чтобы новый шаблон ресурса отображался под своим типом ресурса в диалоговом окне "Добавить ресурс". Теперь вы можете использовать новый шаблон ресурса так часто, как это необходимо.

Редактор ресурсов автоматически предоставляет уникальный идентификатор ресурса. При необходимости вы можете изменить свойства ресурса.

Поместите файлы шаблонов для конкретного языка в подкаталоги основного каталога шаблонов. Например, файлы шаблонов только на английском языке находятся в папке ..\\1033.

Visual Studio ищет новые файлы .rct в \Program Files\Microsoft Visual Studio \VC\VCResourceTemplates, \Program Files\Microsoft Visual Studio \VC\VCResourceTemplates\ (например, LCID 1033 для английского языка) или в любом месте пути включения. Если вы предпочитаете хранить файлы .rct в другом месте, вы должны добавить это место в путь включения.

Чтобы создать и использовать шаблон ресурса

В обозревателе решений щелкните проект правой кнопкой мыши и выберите "Добавить" > "Добавить новый элемент".

На панели "Шаблоны:" выберите "Файл шаблона ресурсов" (.rct).

Укажите имя и местоположение для нового файла .rct и нажмите «Открыть».

Новый файл .rct добавляется в проект и отображается в обозревателе решений в папке "Ресурсы".

Дважды щелкните файл .rct, чтобы открыть его в окне документа. Чтобы добавить ресурсы, щелкните файл правой кнопкой мыши в окне документа и выберите "Добавить ресурс".

Вы можете настроить добавленные ресурсы и сохранить файл .rct.

На панели просмотра ресурсов щелкните правой кнопкой мыши файл .rc и выберите Добавить ресурс.

Нажмите знак "плюс" (+) рядом с ресурсом, чтобы развернуть узел ресурса и просмотреть шаблоны, доступные для этого ресурса.

Дважды щелкните шаблон, который хотите использовать.

При необходимости вы можете изменить добавленный ресурс в его редакторе ресурсов.

Преобразование существующего файла ресурсов в шаблон

Открыв файл сценария ресурсов, в меню выберите Файл > Сохранить имя файла> Как. Укажите местоположение и нажмите OK.

Кто-нибудь знает, как статически скомпилировать любой файл ресурсов прямо в исполняемый файл или файл общей библиотеки с помощью GCC?

Например, я хотел бы добавить файлы изображений, которые никогда не изменяются (а если они изменятся, мне все равно придется заменить файл), и не хочу, чтобы они лежали в файловой системе.

Если это возможно (и я думаю, это потому, что Visual C++ для Windows тоже может это делать), как я могу загрузить файлы, которые хранятся в собственном двоичном файле? Исполняемый файл анализирует сам себя, находит файл и извлекает из него данные?

Возможно, есть вариант для GCC, которого я еще не видел. Использование поисковых систем не дало нужного результата.

Мне нужно, чтобы это работало для разделяемых библиотек и обычных исполняемых файлов ELF.

@blueberryfields: извините за дублирование. Ты прав. Обычно я бы проголосовал за то, чтобы закрыть как дубликат. Но поскольку все они опубликовали такие хорошие ответы, я просто приму один.

Могу ли я добавить, что метод Джона Рипли, вероятно, является лучшим здесь по одной важной причине — выравнивание. Если вы выполняете стандартный objcopy или «ld -r -b binary -o foo.o foo.txt», а затем смотрите на полученный объект с помощью objdump -x, похоже, что выравнивание для блока установлено на 0. Если вы хотите выравнивание должно быть правильным для двоичных данных, отличных от char, я не могу себе представить, что это хорошо.

7 ответов 7

Обновление Я стал предпочитать контрольную сборку Джона Рипли.предлагает решение на основе incbin и теперь использует его вариант.

Я использовал objcopy (GNU binutils), чтобы связать двоичные данные из файла foo-data.bin с разделом данных исполняемого файла:

Это дает вам объектный файл foo-data.o, который вы можете связать со своим исполняемым файлом. Интерфейс C выглядит примерно так

чтобы вы могли делать что-то вроде

Если ваша целевая архитектура имеет особые ограничения в отношении того, где хранятся постоянные и переменные данные, или вы хотите хранить эти данные в сегменте .text, чтобы они соответствовали тому же типу памяти, что и код вашей программы, вы можете поиграть с параметры objcopy еще немного.

Хорошая идея! В моем случае это не очень полезно. Но это то, что я действительно собираюсь добавить в свою коллекцию фрагментов. Спасибо, что поделились этим!

Выдает что-то вроде:

Для совместимости с другим кодом вы можете использовать либо fmemopen для получения "обычного" объекта FILE *, либо альтернативно std::stringstream для создания iostream . std::stringstream не подходит для этого, и вы, конечно, можете просто использовать указатель везде, где можно использовать итератор.

Если вы используете это с automake, не забудьте правильно установить BUILT_SOURCES.

Приятно делать это следующим образом:

  1. Вы получаете текст, поэтому он может быть в системе управления версиями и корректно исправляться.
  2. Он переносим и хорошо определен на любой платформе.

Блин! Это решение, о котором я тоже подумал. Почему кто-то когда-либо хотел бы сделать это вне меня. Файловые системы предназначены для хранения фрагментов данных в четко определенном пространстве имен.

Иногда у вас есть исполняемый файл, который запускается там, где нет файловой системы или даже операционной системы. Или вашему алгоритму нужна предварительно рассчитанная таблица для поиска. И я уверен, что существует гораздо больше случаев, когда хранение данных в программе имеет смысл.

Одним из недостатков этого подхода является то, что некоторые компиляторы не могут обрабатывать такие огромные статические массивы, если ваши изображения особенно велики; способ обойти это, как предлагает ndim, использовать objcopy для преобразования двоичных данных непосредственно в объектный файл; однако это редко вызывает беспокойство.

Имейте в виду, что определение его в заголовке, подобном этому, означает, что каждый файл, который включает его, получит свою собственную копию. Лучше объявить его в шапке как extern и потом определить в cpp. Пример здесь

Вы можете встраивать бинарные файлы в исполняемый файл с помощью компоновщика ld. Например, если у вас есть файл foo.bar, то вы можете встроить его в исполняемый файл, добавив следующие команды в ld

Если вы вызываете ld через gcc, вам нужно будет добавить -Wl

Здесь --format=binary сообщает компоновщику, что следующий файл является двоичным, а --format=default переключается обратно на формат ввода по умолчанию (это полезно, если вы укажете другие входные файлы после foo.bar ).

Тогда вы можете получить доступ к содержимому вашего файла из кода:

Есть также символ с именем "_binary_foo_bar_size" . Я думаю, что это тип uintptr_t, но я не проверял.

@xtofl, если data_end будет указателем, то компилятор подумает, что указатель хранится после содержимого файла. Аналогично, если вы измените тип данных на указатель, то вместо указателя на его начало вы получите указатель, состоящий из первых байтов файла. Я так думаю.

+1: Ваш ответ позволяет мне внедрить загрузчик классов Java и Jar в исполняемый файл для создания собственного средства запуска Java

@xtofl — если вы собираетесь сделать его указателем, сделайте его константным указателем. Компилятор позволяет изменять значение неконстантных указателей, но не позволяет изменять значение, если это массив. Так что, возможно, использование синтаксиса массива требует меньше усилий.

Вы можете поместить все свои ресурсы в ZIP-файл и добавить его в конец исполняемого файла:

Это работает, потому что а) большинству форматов исполняемых образов не важно, есть ли за изображением дополнительные данные и б) zip сохраняет сигнатуру файла в конце zip-файла. Это означает, что после этого ваш исполняемый файл является обычным zip-файлом (за исключением исходного исполняемого файла, который может обрабатывать zip), который можно открыть и прочитать с помощью libzip.

Если я хочу объединить foo0 и resources.zip в foo, мне нужно >, если я введу оба ввода в командной строке cat. (потому что я не хочу добавлять к тому, что уже находится в foo)

Это приведет к созданию недопустимого двоичного файла (по крайней мере, на Mac и Linux), который не может быть обработан такими инструментами, как install_name_tool . Кроме того, двоичный файл по-прежнему работает как исполняемый файл.

Если вы хотите контролировать точное имя символа и размещение ресурсов, вы можете использовать (или скрипт) ассемблер GNU (на самом деле не часть gcc) для импорта целых двоичных файлов. Попробуйте это:

Что бы вы ни использовали, вероятно, лучше всего создать скрипт для генерации всех ресурсов и иметь красивые/единые имена символов для всего.

В зависимости от ваших данных и особенностей системы вам может потребоваться использовать другие значения выравнивания (предпочтительно с .balign для переносимости) или целые типы другого размера для thing_size или другой тип элемента для массива thing[].

Спасибо, что поделились! определенно выглядит интересно, но на этот раз это не то, что я ищу =) с уважением

Именно то, что я искал. Может быть, вы можете проверить, что это также нормально для файлов, размер которых не делится на 4. Похоже, что thing_size будет включать дополнительные байты заполнения.

Что делать, если я хочу, чтобы вещь была местным символом? Возможно, я смогу совместить вывод компилятора со своей сборкой, но есть ли лучший способ?

Недавно мне понадобилось встроить файл в исполняемый файл. Поскольку я работаю в командной строке с gcc и другими, а не с причудливым инструментом RAD, который заставляет все это происходить волшебным образом, мне не сразу было очевидно, как это сделать. Небольшой поиск в сети нашел хак, который, по сути, помещал его в конец исполняемого файла, а затем расшифровывал, где он был, на основе кучи информации, о которой я не хотел знать. Казалось, должен быть лучший способ.

И тут на помощь приходит objcopy. objcopy конвертирует объектные файлы или исполняемые файлы из одного формата в другой. Одним из форматов, которые он понимает, является «двоичный», то есть любой файл, который не находится ни в одном из других форматов, которые он понимает. Итак, вам, вероятно, пришла в голову идея: преобразовать файл, который мы хотим внедрить, в объектный файл, после чего его можно будет просто скомпоновать с остальным кодом.

Допустим, у нас есть файл с именем data.txt, который мы хотим встроить в наш исполняемый файл:

Чтобы преобразовать это в объектный файл, который мы можем связать с нашей программой, мы просто используем objcopy для создания файла ".o":

Это сообщает objcopy, что наш входной файл находится в "бинарном" формате, что наш выходной файл должен быть в формате "elf32-i386" (объектные файлы на x86). Параметр --binary-architecture сообщает objcopy, что выходной файл предназначен для «запуска» на платформе x86. Это нужно для того, чтобы ld принял файл для компоновки с другими файлами для x86. Можно было бы подумать, что указание выходного формата как «elf32-i386» подразумевает это, но это не так.

Теперь, когда у нас есть объектный файл, нам нужно только включить его при запуске компоновщика:

Когда мы запускаем результат, мы получаем ожидаемый вывод:

Конечно, я еще не рассказал вам всю историю и не показал main.c. Когда objcopy выполняет указанное выше преобразование, он добавляет в преобразованный объектный файл некоторые символы «компоновщика»:

После связывания эти символы указывают начало и конец внедренного файла. Имена символов формируются путем добавления binary в начало и добавления _start или _end к имени файла. Если имя файла содержит какие-либо символы, которые недопустимы в имени символа, они преобразуются в символы подчеркивания (например, data.txt становится data_txt). Если вы получаете неразрешенные имена при компоновке с использованием этих символов, выполните hexdump -C для объектного файла и посмотрите в конце дампа имена, выбранные objcopy.

Код для фактического использования встроенного файла теперь должен быть достаточно очевиден:

Одна важная и тонкая вещь, которую следует отметить, заключается в том, что символы, добавленные в объектный файл, не являются "переменными". Они не содержат никаких данных, их значением является их адрес. Я объявляю их как тип char, потому что это удобно для этого примера: встроенные данные — это символьные данные. Однако вы можете объявить их как угодно, например, как int, если данные представляют собой массив целых чисел, или как struct foo_bar_t, если данные представляют собой любой массив foo bar. Если встроенные данные неоднородны, то char, вероятно, наиболее удобен: возьмите его адрес и приведите указатель к нужному типу по мере прохождения данных.

Любые управляемые ресурсы, которые вы хотите изменить, должны быть связанными ресурсами. Редакторы ресурсов Visual Studio не поддерживают редактирование встроенных ресурсов.

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

Файл сценария ресурсов ( .rc ) программы.

Файл шаблона ресурсов ( .rct ).

Отдельный ресурс, существующий как отдельный файл. Этот тип включает файл растрового изображения, значка или курсора, на который ссылается файл .rc.

Файл заголовка, созданный средой разработки. Этот тип включает Resource.h , ссылка на который содержится в файле .rc.

Другие типы файлов, такие как файлы .exe , .dll и .res, также могут содержать ресурсы, к которым вы можете получить доступ, хотя первый два обычно не считаются файлами ресурсов.

Вы можете работать с файлами ресурсов и ресурсами из своего проекта. Вы также можете работать с ресурсами и файлами ресурсов, которые не являются частью текущего проекта или были созданы вне среды разработки Visual Studio. Например, вы можете:

Работа с вложенными и условно включенными файлами ресурсов.

Обновите существующие ресурсы или преобразуйте их в Visual C++.

Импортируйте или экспортируйте графические ресурсы в текущий файл ресурсов или из него.

Включить общие или доступные только для чтения идентификаторы (символы), которые не могут быть изменены средой разработки.

Включите в свой исполняемый файл ( .exe или .dll ) ресурсы, которые не требуют редактирования (или не должны редактироваться), например общие ресурсы между несколько проектов.

Включить типы ресурсов, не поддерживаемые средой разработки.

Редактируемые ресурсы

Файлы следующих типов можно открывать для редактирования содержащихся в них ресурсов:

< /tr>
Имя файла Описание
.rc Файлы сценариев ресурсов
.rct Файлы шаблонов ресурсов
.res Файлы ресурсов
.resx Файлы управляемых ресурсов
.exe Исполняемые файлы
.dll Файлы библиотеки динамической компоновки
.bmp , .ico , .dib , .cur Растровые изображения, значки, панели инструментов и файлы курсоров

Среда Visual Studio работает со следующими файлами и влияет на них при редактировании ресурсов:

Редакторы ресурсов не читают напрямую файлы .rc или resource.h. Компилятор ресурсов компилирует их в файлы .aps, которые используются редакторами ресурсов. Этот файл является этапом компиляции и хранит только символические данные.

Как и в обычном процессе компиляции, несимволическая информация, например комментарии, отбрасывается в процессе компиляции.

Всякий раз, когда файл .aps не синхронизирован с файлом .rc, файл .rc создается заново. Например, при сохранении редактор ресурсов перезаписывает файлы .rc и файлы resource.h. Любые изменения самих ресурсов остаются включенными в файл .rc, но комментарии всегда теряются после перезаписи файла .rc. Информацию о том, как сохранить комментарии, см. в разделе Включение ресурсов во время компиляции.

Манифест ресурсов

В настольных проектах C++ ресурсы манифеста представляют собой XML-файлы, описывающие зависимости, используемые приложением. Например, в Visual Studio этот файл манифеста, созданный мастером MFC, определяет, какую версию общих библиотек управления Windows должно использовать приложение:

Для приложений Windows XP или Windows Vista ресурс манифеста должен указывать самую последнюю версию общих элементов управления Windows для использования приложением. В приведенном выше примере используется версия 6.0.0.0 , которая поддерживает элемент управления Syslink.

У вас может быть только один ресурс манифеста для каждого модуля.

Чтобы просмотреть информацию о версии и типе, содержащуюся в ресурсе манифеста, откройте файл в средстве просмотра XML или в текстовом редакторе Visual Studio. Если вы откроете ресурс манифеста из представления ресурсов, ресурс откроется в двоичном формате.

Чтобы открыть ресурс манифеста

Откройте проект в Visual Studio и перейдите в обозреватель решений.

Разверните папку «Файлы ресурсов», а затем:

Чтобы открыть в текстовом редакторе, дважды щелкните файл .manifest.

Чтобы открыть в другом редакторе, щелкните правой кнопкой мыши файл .manifest и выберите "Открыть с помощью". Укажите используемый редактор и выберите Открыть.

Иногда необходимо встроить ресурсы, такие как значки, изображения, тексты или даже произвольные двоичные данные, в исполняемые файлы. Для этого есть несколько подходов:

  • Windows:
    • Создайте сценарий ресурса, например, resource.rc, и скомпилируйте ресурс в объектный код с помощью компилятора ресурсов MSVC. rc.exe или компилятор ресурсов GCC/Mingw, windres.exe. Затем создайте исполняемый файл, связав код объекта приложения с скомпилированным ресурсом.
    • Функции: FindResource, LoadResource, SizeofResource, LockResource
    • Значок: в Windows это единственный способ добавить inco в исполняемый файл.
    • инструмент objcopy.
    • ld (компоновщик GNU ld)
    • Значок: собственные исполняемые файлы для MacOSX, Linux и BSD не поддерживают встроенный значок, как Windows.
    • Кодировка в формате Base64. Инициализируйте некоторую глобальную строковую переменную с ресурсом, закодированным как строка в формате base64. Когда ресурс необходим, программа декодирует глобальную переменную из base64 в поток байтов, массив байтов, строку или файл.
    • Кодирование массива байтов. Ресурс преобразуется в исходный код C++, содержащий ресурс, закодированный в виде массива байтов. Затем исходный код компилируется в объектный код и добавляется в приложение во время компоновки. Этот метод лучше реализовать с помощью специального внешнего генератора кода или готового инструмента, такого как: