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

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям