TN035: Использование нескольких файлов ресурсов и заголовочных файлов с помощью Visual C++

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

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

Эта записка построена для ответа на эти вопросы в следующем:

Обзор как Visual C++ управляет файлы ресурсов и файлы заголовков

Visual C++ управляет один.Файл RC ресурсов и соответствующего.H заголовочный файл как тесно связанной пары файлов. При изменении и сохранении ресурсов в.RC-файл, косвенно изменить и сохранить символов в соответствующий.H файл. Хотя можно открывать и редактировать несколько.RC файлы в (с помощью пользовательского интерфейса Visual C++ MDI) для любой данный момент.RC файл, вы косвенно редактировать только один соответствующий заголовочный файл.

Заголовочный файл символов

По умолчанию Visual C++ всегда присваивает соответствующий заголовочный файл РЕСУРСА.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-файл, он сливается # include'd ресурсы на родителя.RC файл. Когда вы сохраняете родителя.RC-файл, # include заявление, в сущности, будут заменены # include'd ресурсов. Если слияние произошло не требуется, следует удалить # включить заявление от родительского объекта.RC файл ранее для чтения в Visual C++; Затем с помощью Visual C++, добавить обратно же оператор как во время компиляции директиву # include.

Сохраняет в Visual C++.RC файл три вида выше набор включает информацию (заголовочный файл символов, директивы символов только для чтения и директивы времени компиляции) в # включают, директивы и TEXTINCLUDE ресурсов. TEXTINCLUDE ресурсы, деталь реализации, что не требуется обычно для решения, объясняются Как Visual C++ управляет набор включает информацию.

Анализ AppWizard создан.RC и.H файлов

Изучение кода приложения, подготовленные AppWizard дает представление как Visual C++ управляет несколькими файлы ресурсов и файлы заголовков. Отрывки кода ниже анализ-от приложения MYAPP, производимые с использованием параметров по умолчанию AppWizard.

Создан AppWizard приложение использует несколько файлов ресурсов и нескольких файлов заголовков, которые приведены на диаграмме ниже:

nbsp;  РЕСУРС.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC                               
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Можно просмотреть эти множественные отношения файлов с помощью команды включает в себя набор файлов Visual C++.

MYAPP.RC

Файл ресурсов приложения для редактирования с помощью Visual C++.

РЕСУРС.H является приложением заголовочный файл. Он всегда имеет имя РЕСУРСА.H в AppWizard, в соответствии с Visual C++ по умолчанию именования заголовочного файла. # Include для этот заголовочный файл является первой инструкцией в файле ресурсов (MYAPP.RC):

//Microsoft visual C++ созданного сценария ресурсов
//
# include «resource.h»

RES\MYAPP.WCW

Содержит ресурсы, которые не должны редактироваться Visual C++, но будут включены в финале скомпилирован.EXE-файл. AppWizard создает такие ресурсы не по умолчанию, так как Visual C++ можно редактировать все стандартные ресурсы, включая версии ресурсов (это новая возможность в этом выпуске). Пустой файл генерируется AppWizard в случае, если вы хотите добавить свои собственные пользовательские форматированные ресурсы в этот файл.

Если вы используете пользовательские форматированные ресурсы, их можно добавить к RES\MYAPP.RC2 и редактировать их с помощью текстового редактора Visual C++.

AFXRES.RC и AFXPRINT.RC содержат стандартные ресурсы, необходимые некоторых функций базы. Как RES\MYAPP.RC2, эти два файла рамки условии ресурсов являются include'd в конце MYAPP #.RC и они указываются в директивы времени компиляции диалогового окна задать включает. Таким образом не напрямую просмотреть или отредактировать эти ресурсы framework во время редактирования MYAPP.RC в Visual C++, но они компилируются в двоичный файл приложения.RES файл и финал.EXE-файл. Для получения дополнительных сведений о стандартной базы ресурсов, включая процедуры изменения их см. техническое примечание 23.

AFXRES.H определяет стандартные символы, такие как ID_FILE_NEW, используемое структурой и непосредственно используется в AFXRES.RC. AFXRES.H также включают # в WINRES.H, который содержит подмножество WINDOWS.H, которые необходимы создан Visual C++.RC файлов как AFXRES.RC. Символы, определенные в AFXRES.H доступны как вы измените файл ресурсов приложения (MYAPP.RC). К примеру ID_FILE_NEW используется для файла нового пункта меню в MYAPP.RC в меню ресурс. Нельзя изменить или удалить эти рамки символы.

Включая дополнительные файлы заголовков

Создан AppWizard приложение включает только два заголовочных файлов: ресурс.H и AFXRES.Х. только ресурс.H приложения. Может потребоваться включить дополнительные-только для чтения заголовочные файлы в следующих случаях

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

Заголовочный файл имеет формат и комментарии, что вы не хотите Visual C++ для изменения или отфильтровывать при сохранении файла. К примеру, вы хотите сохранить # определить которые используют символической арифметики как:

# define красный 0
# define голубой 1
# define Грин 2
# define ID_COLOR_BUTTON 1001
# define ID_RED_BUTTON (ID_COLOR_BUTTON + красный)
# define ID_BLUE_BUTTON (ID_COLOR_BUTTON + синий)
# define ID_GREEN_BUTTON (ID_COLOR_BUTTON + зеленый)

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

# include «afxres.h»
# include «second.h»

На новой диаграмме связей файлов теперь выглядит следующим образом:

nbsp;                  AFXRES.H РЕСУРС.H ВТОРОЙ.H                    
          \       /                              
           \     /                                
          MYAPP.RC   
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Совместное использование заголовочный файл между двумя.RC файлов

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

nbsp;    РЕСУРС.H AFXRES.H РЕСУРС.H (для MYAPP1) второй.H   (for MYAPP2)             
          \       /     \       /           
           \     /       \     /             
          MYAPP1.RC MYAPP2.RC                 
           /    \        /     \                   
          /      \      /       \            
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2 AFXPRINT.RC & nbsp
 

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

Использование нескольких файлов ресурсов в одном проекте

Visual C++ и компилятор ресурсов поддерживают несколько.RC файлов в том же проекте через # включают в себя в одной.RC файл в другую. Допускается несколько вложенность. Существуют различные причины для разделения ресурсов вашего проекта на несколько.RC файлов:

Вы можете # включают секунды.RC в директивы времени компиляции в диалоговом окне набор включает:

# i&nclude "res\myapp.rc2"nbsp; / / не Visual C++ редактировать ресурсы
# include «second.rc» / / второе.RC ФАЙЛ

# include «afxres.rc» / / стандартные компоненты
# include «afxprint.rc» / / печать/предварительный просмотр ресурсов

На следующей диаграмме показан результат:

nbsp;  РЕСУРС.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC
              |                                
              |                              
        RES\MYAPP.RC2
        ВТОРАЯ.RC AFXRES.RC AFXPRINT.RC & nbsp
 

С помощью директивы времени компиляции, вы можете организовать ваши Visual C++-изменяемые и неизменяемые ресурсов на несколько.RC файлов, где «мастер» MYAPP.RC не делает ничего, но # include другого.RC файлы. Если вы используете проекта Visual C++.Мак файл, то вам следует включить «мастер».RC файл в проекте, что все ресурсы # include'd компилируются с вашего приложения.

Обеспечение соблюдения нередактируемой Visual C++ файлов

Созданные AppWizard RES\MYAPP.RC2-файл является примером файла, содержащего ресурсы, которые вы не хотите случайно прочитал в Visual C++, а затем написать его обратно с потерей сведений о форматировании. Для защиты от этого, мы возлагаем следующие строки в начале RES\MYAPP.RC2-файл:

# ifdef APSTUDIO_I&NVOKED
 nbsp;  # Error этот файл не является редактируемым в Visual C++
# endif //APSTUDIO_INVOKED

Когда компилируется Visual C++.RC-файл, он определяет APSTUDIO_INVOKED , а также RC_INVOKED. Если повреждена созданных AppWizard файловой структуры и Visual C++ считывает строку # Error выше, он сообщает Неустранимая ошибка и прервать чтение.RC файл.

Управление символы, разделяемых несколькими Visual C++-Ред.RC файлов

При разделении вверх ваши ресурсы на несколько возникают два вопроса.RC файлы, которые вы хотите редактировать отдельно в Visual C++:

На следующей схеме показана организация.RC и.H файлов, которыми занимается первый выпуск:

nbsp;             MYAPP.RC
             /         \
            /           \
MYSTRS.H / MYSHARED.H \ MYME&NUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
   MYSTRS.RC MYMENUS.RC

В этом примере строковые ресурсы хранятся в файле один из ресурсов, MYSTRS.RC и меню хранятся в другом, MYMENUS.RC. Некоторые символы, такие как команды, может потребоваться распределяться между двумя файлами. Например ID_TOOLS_SPELL может быть Идентификатор команды меню для орфографии элемента в меню "Сервис"; и он также может быть Идентификатор строки в командной строке отображается в рамках в строке состояния главного окна приложения.

ID_TOOLS_SPELL символ хранится в общей заголовочном файле MYSHARED.Х. сохранить этот общий заголовочный файл вручную с помощью текстового редактора; Visual C++ не редактировать непосредственно. В двух ресурсов файлы MYSTRS.RC и MYMENUS.RC, указывается # включают в себя MYSHARED.H в чтение директивы для MYAPP.RC, командой набор включает файл, как описано выше.

Это наиболее удобно предвидеть символ будет делиться прежде чем пытаться использовать его для выявления любого ресурса. Добавьте символ в общих заголовочный файл и, если у вас еще не # include'd общих заголовочный файл только для чтения директивы для.RC файл, сделать это перед использованием символ. Если вы не планировали обмен символ таким образом, то вам придется вручную (с помощью текстового редактора) шаг # define заявление для символа от, скажем, MYMENUS.H MYSHARED.H перед его использованием в MYSTRS.RC.

Когда вы управлять символами в нескольких.RC файлы, вы должны помочь Visual C++ не выбирайте тот же ID числовые значения для различных ресурсов (символы). Для любой вопрос.RC-файл, Visual C++ постепенно присваивает идентификаторы в каждом из четырех ID доменов. Между редактирование сессий, Visual C++ держит за последний Идентификатор, назначенный в каждом из доменов в файле заголовков символов для.RC файл. Вот каковы APS_NEXT значения для пустой (новый).RC файл:

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 30 лет
# define _APS_NEXT_COMMAND_VALUE 40001
# define _APS_NEXT_CONTROL_VALUE 1000
# define _APS_NEXT_SYMED_VALUE 101

_APS_NEXT_RESOURCE_VALUE значение следующего символа, которое будет использоваться для ресурс диалогового окна, меню и так далее. Допустимый диапазон значений символов ресурсов — 1 для 0x6FFF.

_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_ . Это значит, что если, скажем, несколько диалоги в двух различных.RC файлов, то весьма вероятно, что же # define значение будет присвоено различных диалогов. К примеру IDD_MY_DLG1 в первом.RC файл может быть назначено то же число, 101, как IDD_MY_DLG2 в секунду.RC файл.

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

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 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-файл, также он сохраняет изменения символа соответствующий ресурс.H файл. Любой из ваших.CPP-файлов, которые относятся к ресурсам в.RC файл должен # включают РЕСУРСА.H файл, обычно в пределах главной заголовочный файл вашего проекта. Это приводит к нежелательным побочным эффектом за счет управления внутреннего проектом среды разработки, который проверяет исходные файлы для зависимостей header. Каждый раз при добавлении нового символа в Visual C++, все.Файл CPP # include ресурсов.H необходимо перекомпилировать.

Visual C++, обходит зависимости РЕСУРСА.H, включив следующий комментарий в первой строке РЕСУРСА.H-файл:

 //{{NO_DEPENDENCIES}}

Среда разработки интерпретирует этот комментарий, игнорируя изменения в ресурс.H тем, что зависимые.CPP-файлов не нужно будет перекомпилировать.

Visual C++ всегда добавляет //{{NO_DEPENDENCIES}} комментарий линию.RC файл при сохранении файла. В некоторых случаях обойдя сборки зависимости РЕСУРСА.H может привести к ошибкам времени выполнения остается незамеченным во время компоновки. К примеру, если вы используете браузер символ изменить числовое значение, присвоенное символом для ресурса, ресурс будет не правильно найдены и загружены, если во время выполнения приложения.Файл CPP, ссылаясь на ресурс не перекомпилированы. В подобных случаях вы должны явно перекомпилировать любого.CPP-файлов, которые вы знаете, страдают от изменения символа в РЕСУРСЕ.H или выберите Перестроить все. Если у вас есть необходимость часто менять значения символов для определенной группы ресурсов, вы вероятно найдете его более удобным и безопасным вспыхнуть эти символы в отдельный-только для чтения заголовочный файл, как описано в предыдущем разделе Включая дополнительные файлы заголовков.

Как Visual C++ управляет набор включает в себя информацию

Как указывалось выше, набор включает команды меню файл позволяет задать три вида информации:

Ниже описывается, каким образом Visual C++ поддерживает эту информацию в.RC файл. Эта информация для использования Visual C++ не требуется, но он может повысить ваше понимание, что более уверенно использовать набор включает функцию.

Каждая из вышеуказанных трех типов набор включает информацию хранится в.RC файл в двух формах: (1), # включить или других директив, интерпретируемые компилятором ресурсов, а 1 (2) специальные TEXTINCLUDE ресурсов интерпретируемые только Visual C++.

TEXTINCLUDE ресурса призвана безопасно хранить значение включить информацию в форме, которая легко презентабельны в Visual C++ набор включает диалоговое окно. TEXTINCLUDE — это тип ресурса определяется Visual C++. Visual C++ признает три конкретных ресурсов TEXTINCLUDE, которые имеют ресурсов идентификационные номера 1, 2 и 3:

TEXTINCLUDE ресурс i.d. Набор включает в себя информацию
1 Заголовочный файл символов
2 Директивы символов только для чтения
3 Директивы времени компиляции

Каждый из трех типов набор включает информацию иллюстрируется по умолчанию MYAPP.RC и ресурсов.H файлы, создаваемые AppWizard, как описано ниже. Дополнительные \0 и "", RC синтаксиса маркеров между BEGIN и END блоки, обязаны задать нулевой завершенных строк и символ двойной кавычки соответственно.

Заголовочный файл символов

Форма символа заголовочный файл сведений, интерпретировать компилятором ресурсов — оператор просто # include:

# include «resource.h»

Соответствующий ресурс TEXTINCLUDE:

1 TEXTINCLUDE ВЫГРУЖАЕМАЯ
НАЧАТЬ
   # resource.h\0 "
КОНЕЦ

Директивы символов только для чтения

Директивы символов только для чтения, включены в верхней части MYAPP.RC в следующей форме интерпретируемые компилятором ресурсов:

# include «afxres.h»

Соответствующий ресурс TEXTINCLUDE:

2 TEXTINCLUDE ВЫГРУЖАЕМАЯ
НАЧАТЬ
   "# include" «afxres.h""\r\n»
   «\0»
КОНЕЦ

Директивы времени компиляции

Директивы времени компиляции в конце MYAPP.RC в следующей форме интерпретируемые компилятором ресурсов:

# ifndef APSTUDIO_I&NVOKED
///////////////////////
//
/ / Из TEXTINCLUDE 3
//
# include "res\myapp.rc2"nbsp; / / не Visual C++ редактировать ресурсы

# include «afxres.rc» / / стандартные компоненты
# include «afxprint.rc» / / печать/предварительный просмотр ресурсов
# endif / / не APSTUDIO_INVOKED

Директива # ifndef APSTUDIO_INVOKED предписывает пропускать директивы времени компиляции Visual C++.

Соответствующий ресурс TEXTINCLUDE:

3 TEXTI&NCLUDE ВЫГРУЖАЕМАЯ
НАЧАТЬ
"# include" "res\myapp.rc2""nbsp; / / не Visual C++ отредактирован resources\r\n "
«\r\n»
"# include""afxres.rc" "/ / стандарт components\r\n"
"# include""afxprint.rc" "/ / Печать/предварительный просмотр resources\r\n"
«\0»
КОНЕЦ

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index