TN035: Использование нескольких файлов ресурсов и файлы заголовка с Visual C++
Примечание |
---|
Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации. |
Эта заметка описывает, как редактор ресурсов Visual C++ поддерживает несколько файлов ресурсов и файлы заголовка общие в одном проекте или общих через несколько проектов и как можно воспользоваться преимуществами этой поддержки.Эта заметка содержит ответы на эти вопросы:
Может понадобиться разделить проект, когда пользователь в несколько файлов ресурсов и файлы заголовка и способ его?
Способ совместно использовать общий заголовок. Файл h между файлами .RC 2?
Как разделяете ресурсы проекта на несколько rc-файлов?
Сделайте его как (и средства) управляют зависимостей построения между .RC, CPP и. файлы h?
Следует иметь в виду, что при добавлении дополнительного файла ресурсов в проект, то ClassWizard не распознает ресурсы в добавленном файле.
Эта заметка состоит из, чтобы ответить на приведенные выше вопросы:
Overview of How Visual C++ Manages Resource Files and Header Files приводятся общие сведения о процессе набор ресурсов содержит команду в Visual C++ позволяет использовать несколько файлов ресурсов и файлы заголовка в том же проекте.
Analysis of AppWizard-created .RC and .H Files выглядит несколько ресурс и файлы заголовков, которые используются AppWizard-созданным приложением.Эти файлы используются в качестве хорошей модели для дополнительных файлов ресурсов и файлов заголовков может потребоваться добавить в проект.
Including Additional Header Files описывает, когда может потребоваться включить несколько файлов заголовков и предоставляет подробные сведения о том, как сделать.
Sharing a Header File Between Two .RC Files показано, как можно совместно использовать один файл заголовка между несколькими файлами .RC в разных проектах или в том же проекте.
Using Multiple Resource Files in the Same Project описывает, когда может потребоваться замкнули разбить вулканизационный проект в несколько rc-файлов и предоставить подробные сведения о том, как сделать.
Enforcement of Non-Editable Visual C++ Files описывается, как можно убедиться в том, что Visual C++ не изменяет и случайного изменения формата пользовательский ресурс.
Managing Symbols Shared by Multiple Visual C++-Edited .RC Files описывает, как совместно использовать одни и те же символы в нескольких rc-файлов и присвоить, как избежать повторяющихся числовые значения идентификатора.
Managing Dependencies Between .RC, .CPP, and .H Files описывает, как Visual C++, предотвращаются ненужные повторной компиляции файлов .CPP, зависящие от файлов символов ресурсов.
Технические How Visual C++ Manages Set Includes Information предоставляет сведения о том, как Visual C++ содержат отслеживание нескольких (вложенных файлов RC) и несколько файлов заголовка, который #include'd файл .RC.
Общие сведения о Visual C++ управляет файлы ресурсов и файлы заголовков
Visual C++ управляет один файл ресурсов .RC и сопоставления. Файл заголовка h, как тесно связанной пара файлов.При редактировании и сохранить ресурсы в файле .RC, которые косвенно alter и сохранять символы в сопоставлении. Файл з.Хотя можно открывать и изменять несколько rc-файлов за раз (с помощью пользовательского интерфейса MDI Visual C++) для любого заданного файла .RC, которые косвенно изменить только один соответствующий файл заголовка.
Файл заголовков символов
По умолчанию Visual C++ имена всегда соответствующий файл заголовка RESOURCE.H, независимо от имени файла ресурсов (например, MYAPP.RC).С помощью команды Включение ресурсов из меню Вид в Visual C++, можно изменить имя файла заголовка, обновить файл файла заголовков символов в диалоговом окне набор включает.
Директивы символов только для чтения
Хотя Visual C++ изменяется только один файл заголовка для любого заданного файла .RC, Visual C++ поддерживает ссылки на заданным символам в дополнительных только для чтения файлы заголовка.С помощью команды Включение ресурсов из меню Вид в Visual C++ можно указать любое число дополнительных только для чтения файлов заголовков, как директивы символов только для чтения.«Только для чтения» ограничение означает, что при добавлении нового ресурса в файле .RC, можно использовать символ определен в файле заголовка только для чтения; но при удалении ресурс, то символ по-прежнему остается только для чтения, определенным в файле заголовка.Нельзя изменять числовое значение, присвоенное только для чтения символ.
Директивы время компиляции
Visual C++ также поддерживает вложение файлов ресурсов, где один файл .RC #include'd в другом.При редактировании данный rc-файл с помощью Visual C++, все ресурсы в файлах #include'd невидимы.Однако при компилировании файла .RC, файлы #include'd также компилировать.С помощью команды Включение ресурсов из меню Вид в Visual C++ можно задать любое количество файлов #include'd .RC, как директивы времени компиляции.
Обратите внимание, что происходит при чтении в Visual C++ файл .RC #include RC другой файл, который не определен как директива времени компиляции.Такая ситуация может возникнуть при принесете в Visual C++ файл .RC, который ранее водили вручную с текстовым редактором.Если Visual C++ #include'd считывает файл .RC, он выполняет слияние ресурсы в файл .RC #include'd родителя.При сохранении файла .RC выписка родителя, #include в результате будет заменено ресурсами #include'd.Если вы не хотите сделать это слияние, необходимо удалить оператор #include от родительского файла .RC до его считывания в Visual C++. затем с помощью Visual C++, добавьте обратно такая же, как оператор директиву #include времени компиляции.
Visual C++ сохраняет в rc-файле 3 типа вышеуказанного набора содержат информацию (файл заголовков символов, директивы символов только для чтения и директивы #include) в рекомендациях по времени компиляции и в ресурсах TEXTINCLUDE.Ресурсы TEXTINCLUDE, реализации, которые обычно не нужно обрабатывать, описаны в Например, набор элементов управления Visual C++ включает сведения.
AppWizard-Созданного .RC и анализ. файлы h
Анализ кода приложения, созданный AppWizard предоставляет проницательность в таких как Visual C++ управляет несколько файлов ресурсов и файлы заголовка.Фрагменты кода расмотренные ниже из приложения MYAPP созданного AppWizard с использованием параметров по умолчанию.
AppWizard-созданное приложение использует несколько файлов ресурсов и несколько файлов заголовков, как получается в итоге в схеме ниже:
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Можно просматривать эти связи нескольких файлов с помощью файл или набор Visual C++ включить команду.
- MYAPP.RC
Файл ресурсов приложения, который редактируется с помощью Visual C++.
RESOURCE.H специфический для приложения файла заголовка.Он всегда имеет имя AppWizard RESOURCE.H, именование согласованность с Visual C++ по умолчанию файла заголовка.#include Для этого файла заголовка первая выписка в файле ресурсов (MYAPP.RC):
//Microsoft Visual C++ generated resource script
//
#include "resource.h"
- RES \ MYAPP.RC2
Содержит ресурсы, которые не будут изменять Visual C++, но файл exe выпускными включит в компилированном экзаменами.AppWizard не создает такое по умолчанию ресурсов, поскольку Visual C++ может изменить все стандартные ресурсы, в том числе ресурс версии (новую функцию в этом выпуске).Пустой файл создается AppWizard в случае, если нужно добавить собственные пользовательские ресурсы форматированные в этот файл.
Если используются пользовательские ресурсы форматированные, то их можно добавить к RES \ MYAPP.RC2 и изменять их с помощью текстового редактора Visual C++.
AFXRES.RC и AFXPRINT.RC содержат стандартные ресурсы необходимы некоторыми функциями платформы.Как RES \ MYAPP.RC2 эти 2.NET Framework-обеспечили файлы ресурсов #include'd в конце MYAPP.RC и их определен в рекомендациях по времени компиляции набора включает диалоговое окно.Таким образом, можно непосредственно не просмотреть или изменить эти ресурсы платформы при редактировании MYAPP.RC в Visual C++, однако они компилироваться в exe-файла приложения бинарный RES файла и окончательное.Дополнительные сведения о стандартных ресурсов платформы, включая процедуры для изменения их см. в разделе Техническая примечание 23.
AFXRES.H определяет стандартные символы, как ID_FILE_NEW, используемое платформой и в частности, используемое в AFXRES.RC.AFXRES.H WINRES.H #include также, который содержит подмножество WINDOWS.H, необходимые для Visual C++, созданных rc-файлов, а также AFXRES.RC.Символы, определенные в AFXRES.H доступны при редактировании файла ресурсов приложения (MYAPP.RC).Например, ID_FILE_NEW используется для пункта меню в меню MYAPP.RC файла нового ресурса.Нельзя изменять и удалять эти .NET Framework-определенные символы.
В том числе дополнительные файлы заголовков
AppWizard-созданное приложение включает только 2 файла заголовка. RESOURCE.H и AFXRES.H.Только RESOURCE.H зависит от приложения.Можно включить дополнительные только для чтения файлы заголовков в следующих случаях:
Файл заголовка предоставляется внешним источником или должны совместно использовать файл заголовка для нескольких проектов или нескольких частей одного проекта.
Файл заголовка содержит форматирование и комментарии, что не нужно изменять или Visual C++ отфильтровать, когда он сохраняет файл.Например, возможно нужно сохранить #define, используйте символьную арифметические операции, как:
#define RED 0
#define BLUE 1
#define GREEN 2
#define ID_COLOR_BUTTON 1001
#define ID_RED_BUTTON (ID_COLOR_BUTTON + RED)
#define ID_BLUE_BUTTON (ID_COLOR_BUTTON + BLUE)
#define ID_GREEN_BUTTON (ID_COLOR_BUTTON + GREEN)
Можно включить дополнительные только для чтения файлы заголовков с помощью команды Включение ресурсов указать выписку #include как вторая директивы символов только для чтения, например:
#include "afxres.h"
#include "second.h"
Диаграмма связей нового файла теперь выглядит следующим образом:
AFXRES.H
RESOURCE.H SECOND.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Совместно использовать файл заголовка между файлами .RC 2
Можно совместно использовать файл заголовка между 2 файлами .RC, находящиеся в разных проектах или, возможно, тем же проектом.Чтобы сделать это, просто применять только для чтения метод директив на оба описанных выше файлам .RC.В случае, когда 2 файла .RC для разных приложений (различных проектов), результат проиллюстрирован в следующей схеме:
RESOURCE.H AFXRES.H RESOURCE.H
(for MYAPP1) SECOND.H (for MYAPP2)
\ / \ /
\ / \ /
MYAPP1.RC MYAPP2.RC
/ \ / \
/ \ / \
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2
AFXPRINT.RC
Второй случай, когда файл заголовка используется совместно 2 файлами .RC в одном приложении (проект) описано ниже.
Использование нескольких файлов ресурсов, в том же проекте
Visual C++ и компилятор ресурсов поддерживают несколько rc-файлов в одном проекте с помощью #include одного файла .RC в другом.Множественное вложение разрешено.Причины разделить различные ресурсы проекта на несколько rc-файлов:
Легче управлять большим количеством ресурсов между несколькими участниками команды проекта если разделите ресурсы на несколько rc-файлов.Если используется пакет управления системы управления версиями для извлечение файлов и вернуть изменения, то разделение ресурсов в несколько rc-файлов будет получен более точный элемент управления для управления изменениями к ресурсам.
Если необходимо использовать директивы препроцессора, например #ifdef #endif и #define для частей собственных ресурсов, то должна выявить их только для чтения ресурсов, которые будут компилировать компилятором ресурсов.
Компонент нагрузят rc-файлов и сохраняет быстрее в Visual C++ не один составной rc-файл.
Если требуется поддерживать ресурс с текстовым редактором в людск-четкой форме, необходимо сохранить его в файле .RC, отделен от одного правок Visual C++.
Если необходимо хранить определяемый пользователем ресурс в бинарный или формы, текст, interpretable другим специальное редактором данных, необходимо сохранять его в отдельном rc-файле поэтому Visual C++ не изменяет формат для шестнадцатеричного данным.Wav-файла звуковые ресурсы () в образце расширенной SPEAKN хорошим примером MFC Основных понятий.
Можно SECOND.RC #include в рекомендациях по времени компиляции в набор включает диалоговое окно:
#include "res\myapp.rc2" // non-Visual C++ edited resources
#include "second.rc" // THE SECOND .RC FILE
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
Результат проиллюстрирован в следующей схеме:
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
SECOND.RC
AFXRES.RC
AFXPRINT.RC
Использование директивы времени компиляции можно организовать в визуальный элемент C++-editable и нередактируемой ресурсы на несколько rc-файлов, где «master» MYAPP.RC ничего не делает, но #include другие rc-файлов.Если используется файл проекта .MAK Visual C++, необходимо включить «главный rc-файл проекта», так что все ресурсы #include'd будет компилировать с приложением.
Применение файлов Noneditable Visual C++
AppWizard-созданный файл RES \ MYAPP.RC2 пример файла, содержащего ресурсы, которые не нужно случайным образом для чтения в Visual C++ и затем записать их обратно за пределами с потерей данных о форматировании.Чтобы защититься от этого, поместите следующие линии в начале файла RES \ MYAPP.RC2:
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Visual C++
#endif //APSTUDIO_INVOKED
Если Visual C++ будет компилироваться rc-файл, он определяет APSTUDIO_INVOKED так же, как RC_INVOKED.Если AppWizard-созданная структура файла повреждена и Visual C++ считывает линию #error выше, он отчеты неустранимая ошибка и прерывает чтение файла .RC.
Управление символами совместно используемые несколькими файлами визуального элемента C++-Edited RC
2 Проблемы возникают, когда необходимо разделить поиск по системным ресурсам на несколько rc-файлов, которые нужно редактировать отдельно в Visual C++:
Можно совместно использовать одни и те же символы в нескольких rc-файлов.
Необходимо помочь Visual C++, чтобы избежать присвоить те же числовые значения идентификатора к указанным ресурсам (символы).
На следующей диаграмме показана .RC и organization. Файлы h, которое связано с первым проблемой.
MYAPP.RC
/ \
/ \
MYSTRS.H / MYSHARED.H \ MYMENUS.H
\ / / \ \ \
\ / / \ \ \
MYSTRS.RC MYMENUS.RC
В этом примере строковые ресурсы сохраняются в одном файле ресурсов, MYSTRS.RC и меню сохраняются в других MYMENUS.RC.Некоторые символы, такие как для команды, могут быть общими между 2 файлами.Например, ID_TOOLS_SPELL может быть идентификатором команды меню для элемента произношения как в меню сервис. и может быть также идентификатор строки командной строки, заданной структурой в строке состояния основного окна приложения.
Символ ID_TOOLS_SPELL быть в общем файле заголовка MYSHARED.H.Выполняется обслуживание этот общий файл заголовка вручную в текстовом редакторе. Visual C++ непосредственно не изменяет его.В файлах ресурсов MYSTRS.RC 2 и MYMENUS.RC указывается #include MYSHARED.H только для чтения для MYAPP.RC, директивах с помощью команды Включение ресурсов, как описано выше.
Наиболее удобно предвидеть символ совместном использовании до попытке использовать его указать любой ресурс.Добавьте символ на общий файл заголовка и при отсутствии уже #include'd общий файл заголовка только для чтения " директивах для rc-файла, необходимо выполнить, чтобы перед использованием символов.Если не предвидели совместно использовать символ в этом случае производится вручную (с помощью текстового редактора) переместите оператор #define для символов из говорите, MYMENUS.H к MYSHARED.H перед его использованием в MYSTRS.RC.
При управлении символы в нескольких файлах .RC, также необходимо помочь Visual C++, чтобы избежать присвоить те же числовые значения идентификатора к указанным ресурсам (символы).Для любого заданного файла .RC, Visual C++ инкрементно присвоит идентификаторов в каждом из 4 идентификаторов доменов.Между редактирование сеансы, Visual C++ отслеживает последнего идентификатора его присвоил в каждом из доменов в файле заголовка символов для rc-файла.Вот как значения APS_NEXT для пустого (нового файла .RC):
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
_APS_NEXT_RESOURCE_VALUE следующее символьное значение, которое будет использоваться для ресурса диалогового окна ресурса меню и т дДопустимый диапазон значений для 0x6FFF ресурса 1 символов.
_APS_NEXT_COMMAND_VALUE следующее символьное значение, которое будет использоваться для идентификации команд.Допустимый диапазон для символьных значений команды 0x8000 до 0xDFFF.
_APS_NEXT_CONTROL_VALUE следующее символьное значение, которое будет использоваться для управления диалогового окна.Допустимый диапазон символов для значений элементов управления диалогового окна 8 до 0xDFFF.
_APS_NEXT_SYMED_VALUE следующее символьное значение, которое будет выдано, если пользователь вручную присвоить значение символа с помощью новой команды в браузере символов.
Запускает Visual C++ с немного более высокими значениями этими наименьшее юридическое значение создать новый rc-файл.AppWizard также инициализирует эти значения на более подходящее для приложений MFC.Дополнительные сведения о диапазонах значений идентификаторов см. в разделе Техническая примечание 20.
Теперь при каждом создании нового файла ресурсов, даже в том же проекте Visual C++ определяет те же значения _APS_NEXT_.Это значит, что если добавить, скажите несколько диалоговые окна на 2 различных файлах .RC, наверно, что одно и то же значение #define будет присвоено различным диалоговым окнам.Например, IDD_MY_DLG1 в первом rc-файле может быть один и тот же номер, присвоенный 101, так как IDD_MY_DLG2 во втором файле .RC.
Чтобы избежать этого, необходимо зарезервировать отдельном числовой диапазон для каждого из 4 идентификаторов доменов в соответствующих файлах RC.Сделайте это вручную обновить значения _APS_NEXT в каждом из файлов before .RC начать добавлять ресурсы.Например, если первый файл .RC использует значения по умолчанию _APS_NEXT, то может потребоваться присвоить следующие значения _APS_NEXT на второй файл .RC:
#define _APS_NEXT_RESOURCE_VALUE 2000
#define _APS_NEXT_COMMAND_VALUE 42000
#define _APS_NEXT_CONTROL_VALUE 2000
#define _APS_NEXT_SYMED_VALUE 2000
Конечно, по-прежнему возможно, Visual C++ присвоит настолько большое количество идентификаторов в первом rc-файле, числовые значения, начинающиеся для перекрывающихся эти зарезервированные для второго файла .RC.Необходимо зарезервировать достаточно большие диапазона так, что это не происходит.
Управление зависимостями между .RC, CPP и. файлы h
Если Visual C++ сохраняет файл .RC, он также сохраняет изменения в соответствующем файле RESOURCE.H символов.Любой из cpp-файлов, которые относятся к ресурсам в rc-файле файле RESOURCE.H #include, обычно из файла заголовка проекта главному.Это ведет к эффекту нежелательному побочному из-за управления внутреннего проекта интегрированной среды разработки, просматривает исходные файлы для зависимостей заголовка.При каждом добавлении нового символа в Visual C++, весь файл CPP, #include RESOURCE.H было бы необходимо перекомпилировать.
Visual C++, экранирует зависимость от RESOURCE.H, добавив следующий комментарий как первая линия файле RESOURCE.H.
//{{NO_DEPENDENCIES}}
Интегрированная среда разработки интерпретирует этот комментарий, игнорировать изменения RESOURCE.H так как зависимые файлы .CPP не будет перекомпилировать.
Visual C++ всегда добавить линию комментария //{}} {NO_DEPENDENCIES в файл .RC, когда он сохраняет файл.В некоторых случаях экранирования зависимостей построения на RESOURCE.H может привести к ошибкам во время выполнения незамеченными во время компоновки.Например, если используется браузер символов, чтобы изменять числовое значение, присвоенное символ для ресурса, ресурс не будет найден правильно и не загружается во время выполнения повторной компиляции приложения, если cpp-файл, относящийся к ресурсу.В таких случаях необходимо явно перекомпилировать все файлы .CPP, которые известны затронутых изменениями символов в RESOURCE.H или выберите Перестроить все.Если есть необходимость часто изменить значения символов для одной группы в составе ресурсы, вероятно, найдите его более удобные и безопасные для прерывания вне эти символы в отдельном только для чтения файл заголовка, как описано в предыдущем разделе, в В том числе дополнительные файлы заголовков.
Например, набор элементов управления Visual C++ включает сведения
Как отмечалось выше, набор меню " Файл " содержит команду позволяет указать 3 типов сведений:
Файл заголовков символов
Директивы символов только для чтения
Директивы время компиляции
Далее описывается, как Visual C++ поддерживает эту информацию в файле .RC.Нет необходимости использовать эти сведения в Visual C++, однако оно может увеличить ваше понимание, что позволяет использовать более уверенно набор включить функцию.
Каждый из типов выше 3 набора включает данные хранятся в файле .RC в формах: 2 (1) или другие директивы #include interpretable компилятором ресурсов и (2) as специальные ресурсы TEXTINCLUDE interpretable только Visual C++.
Назначение ресурса TEXTINCLUDE безопасно хранить набор включает сведения в форме, которая легко презентабельна в диалоговом окне набор включает Visual C++.TEXTINCLUDE тип ресурса, заданного в Visual C++.Visual C++ распознает 3 конкретных ресурсов TEXTINCLUDE, имеющих идентификационные номера 1, 2 и 3 ресурсов:
Идентификатор ресурса TEXTINCLUDE |
Тип набора включает сведения |
---|---|
1 |
Файл заголовков символов |
2 |
Директивы символов только для чтения |
3 |
Директивы время компиляции |
Каждый из 3 типов набора включает сведения показывает значение по умолчанию MYAPP.RC и файлами RESOURCE.H, созданными AppWizard, как описано ниже.Лишние \ 0 и токены НАЧИНАЮТСЯ и "" требуются синтаксисом RC определяют блоки ЭЛЕМЕНТ ноль завершенные строк и символ двойной кавычки, соответственно.
Файл заголовков символов
Форма сведений о файлах заголовков символов интерпретированная компилятором ресурсов просто выписка #include:
#include "resource.h"
Соответствующий ресурс TEXTINCLUDE:
1 TEXTINCLUDE DISCARDABLE
BEGIN
#resource.h\0"
END
Директивы символов только для чтения
Директивы символов только для чтения, отображаются в верхней части MYAPP.RC в следующей форме interpretable компилятором ресурсов:
#include "afxres.h"
Соответствующий ресурс TEXTINCLUDE:
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
Директивы время компиляции
Директивы время компиляции включаются в конце MYAPP.RC в следующей форме interpretable компилятором ресурсов:
#ifndef APSTUDIO_INVOKED
///////////////////////
//
// From TEXTINCLUDE 3
//
#include "res\myapp.rc2" // non-Visual C++ edited resources
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
#endif // not APSTUDIO_INVOKED
Директива #ifndef APSTUDIO_INVOKED программа Visual C++ пропустить по принципам времени компиляции.
Соответствующий ресурс TEXTINCLUDE:
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""res\myapp.rc2"" // non-Visual C++ edited resources\r\n"
"\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#include ""afxprint.rc"" // printing/print preview resources\r\n"
"\0"
END