Поделиться через


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

Примечание.

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

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

  • Если вы хотите разделить проект на несколько файлов ресурсов и (или) файлов заголовков и как это сделать

  • Как совместно использовать общий файл заголовка .H между двумя .RC файлами

  • Как разделить ресурсы проекта на несколько .RC файлов

  • Как управлять зависимостями сборки между .RCфайлами и .CPP.H файлами (и средствами)

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

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

  • Общие сведения о том, как Visual C++ управляет файлами ресурсов и файлами заголовков, содержит общие сведения о том, как команда "Набор ресурсов включает" в Visual C++ позволяет использовать несколько файлов ресурсов и файлов заголовков в одном проекте.

  • Анализ созданного .RC приложения AppWizard и .H files проверяет несколько файлов ресурсов и заголовков, используемых приложением AppWizard. Эти файлы служат в качестве хорошей модели для создания дополнительных файлов ресурсов и файлов заголовка, которые может потребоваться добавить в проект.

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

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

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

  • Применение не редактируемых файлов Visual C++ описывает, как убедиться, что Visual C++ не редактирует и непреднамеренно переформатирует пользовательский ресурс.

  • Управление символами, общими для нескольких измененных файлов Visual C++.RC, описывает, как совместно использовать одни и те же символы в нескольких .RC файлах и как избежать назначения повторяющихся числовых значений идентификатора.

  • Управление зависимостями между .RCфайлами и .CPP.H файлами описывает, как Visual C++ позволяет избежать ненужных перекомпиляции .CPP файлов, зависящих от файлов символов ресурсов.

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

Общие сведения о том, как Visual C++ управляет файлами ресурсов и файлами заголовков

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

Диалоговое окно "Ресурс представления ресурсов"

Чтобы получить доступ к ресурсу Включает, откройте представление ресурсов, а затем щелкните файл правой кнопкой мыши .RC и выберите "Включить ресурс".

Файл символов заголовка

По умолчанию Visual C++ всегда называет соответствующий файл RESOURCE.Hзаголовка независимо от имени файла ресурса (например, MYAPP.RC). Файл заголовка символов: раздел в диалоговом окне "Включает ресурсы" в Visual C++, позволяет изменить имя этого файла заголовка. Введите новое имя файла в поле редактирования раздела.

Примечание.

Файлы ресурсов, не расположенные в том же каталоге, что .RC и файл, должны быть предопределен относительный путь с escaped-'\' для правильного чтения.

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

Хотя Visual C++ редактирует только один файл заголовка для любого заданного .RC файла, Visual C++ поддерживает ссылки на символы, определенные в дополнительных файлах заголовков только для чтения. Директивы символов только для чтения: раздел в диалоговом окне "Включает ресурсы" позволяет указать любое количество дополнительных файлов заголовков только для чтения в качестве директив символов только для чтения. Ограничение только для чтения означает, что при добавлении нового ресурса в .RC файл можно использовать символ, определенный в файле заголовка только для чтения. Однако при удалении ресурса символ по-прежнему определяется в файле заголовка только для чтения. Нельзя изменить числовое значение, назначенное символу только для чтения.

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

Visual C++ также поддерживает вложение файлов ресурсов, где один .RC файл входит в другой с помощью директивы #include . При изменении заданного .RC файла с помощью Visual C++все ресурсы в включенных файлах не отображаются. Но при компиляции файла также компилируются .RC включенные файлы. Директивы времени компиляции: раздел "Ресурсы включает" диалоговое окно "Ресурсы" позволяет указать любое количество .RC файлов, включаемых в качестве директив времени компиляции.

Обратите внимание, что происходит при чтении в Visual C++ .RC файла, включающего другой .RC файл, который не указан в качестве директивы времени компиляции. Эта ситуация может возникнуть при переносе в Visual C++ .RC файла, который вы ранее поддерживали вручную с помощью текстового редактора. Когда Visual C++ считывает включенный .RC файл, он объединяет включенные ресурсы в родительский .RC файл. При сохранении родительского .RC файла #include инструкция, в действительности, будет заменена включенными ресурсами. Если вы не хотите, чтобы это слияние произошло, необходимо удалить #include инструкцию из родительского .RC файла перед его чтением в Visual C++. Затем с помощью Visual C++добавьте ту же #include инструкцию, что и директива "Время компиляции".

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

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

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

Как показано на схеме ниже, приложение, созданное мастером приложений, использует несколько файлов ресурсов и файлов заголовков.

   RESOURCE.H     AFXRES.H
          \       /
           \     /
          MYAPP.RC
              |
              |
        RES\MYAPP.RC2
        AFXRES.RC
        AFXPRINT.RC

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

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

RESOURCE.H — это файл заголовка для конкретного приложения. Оно всегда называется RESOURCE.H AppWizard, в соответствии с именованием по умолчанию Visual C++файла заголовка. Для #include этого файла заголовка используется первая инструкция в файле ресурсов (MYAPP.RC):

//Microsoft Visual C++ generated resource script
//
#include "resource.h"

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

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

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

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

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

Созданное приложение AppWizard включает только два файла заголовка: 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)

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

#include "afxres.h"
#include "second.h"

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

                   AFXRES.H
    RESOURCE.H     SECOND.H
          \       /
           \     /
          MYAPP.RC
              |
              |
        RES\MYAPP.RC2  
        AFXRES.RC
        AFXPRINT.RC

Общий доступ к файлу заголовка между двумя .RC файлами

Может потребоваться предоставить общий доступ к файлу заголовка между двумя .RC файлами, которые находятся в разных проектах или, возможно, один и тот же проект. Для этого примените метод директив только для чтения, описанный выше, к обоим .RC файлам. В случае, когда два .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

В этом случае второй файл заголовка используется двумя .RC файлами в одном приложении (проекте) ниже.

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

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

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

  • Если вы хотите использовать директивы препроцессора, такие как #ifdef, #endifи #defineдля частей ресурсов, необходимо изолировать их в ресурсах только для чтения, которые будут компилироваться компилятором ресурсов.

  • Файлы компонентов .RC загружают и сохраняются быстрее в Visual C++, чем один составной .RC файл.

  • Если вы хотите сохранить ресурс с текстовым редактором в форме, доступной для чтения, следует сохранить его в .RC файле отдельно от одного редактирования Visual C++.

  • Если необходимо сохранить определяемый пользователем ресурс в двоичном или текстовом формате, который интерпретируется другим специализированным редактором данных, его следует сохранить в отдельном .RC файле, чтобы Visual C++ не изменял формат на шестнадцатеричные данные. Ресурсы .WAV файлов (звук) в образце расширенных концепций MFC SPEAKN являются хорошим примером.

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

#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

Используя директивы времени компиляции, вы можете упорядочить редактируемые и не редактируемые ресурсы Visual C++в несколько .RC файлов, где основное MYAPP.RC не делает ничего, кроме #include других .RC файлов. Если вы используете файл проекта .MAK Visual Studio C++, необходимо включить в проект основной .RC файл, чтобы все включенные ресурсы компилировались с приложением.

Принудительное применение не редактируемых файлов 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 файла.

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

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

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

  • Необходимо сделать так, чтобы Visual C++ не назначала одни и те же числовые идентификаторы разным ресурсам (символам).

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

              MYAPP.RC
             /         \
            /           \
MYSTRS.H   / MYSHARED.H  \  MYMENUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
      MYSTRS.RC         MYMENUS.RC

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

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

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

При управлении символами в нескольких .RC файлах также необходимо помочь Visual C++ избежать назначения одинаковых числовых значений идентификатора отдельным ресурсам (символам). Для любого заданного .RC файла Visual C++ добавочно назначает идентификаторы в каждом из четырех доменов идентификаторов. Между сеансами редактирования 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 — это следующее значение символа, которое будет использоваться для ресурса диалогового окна, ресурса меню и т. д. Допустимый диапазон значений символов ресурсов — от 1 до 0x6FFF.

_APS_NEXT_COMMAND_VALUE — это следующее значение символа, которое будет использоваться для идентификации команды. Допустимый диапазон значений символов команд — от 0x8000 до 0xDFFF.

_APS_NEXT_CONTROL_VALUE — это следующее значение символа, которое будет использоваться для элемента управления диалоговым окном. Допустимый диапазон значений символов элемента управления "диалоговое окно" — от 8 до 0xDFFF.

_APS_NEXT_SYMED_VALUE — следующее значение символа, которое будет выдано вручную при назначении значения символа с помощью команды New в браузере символов.

Visual C++ начинается с немного более высоких значений, что наименьшее юридическое значение при создании нового .RC файла. AppWizard также инициализирует эти значения с использованием чего-либо более подходящего для приложений MFC. Дополнительные сведения о диапазонах значений идентификаторов см . в техническом примечание 20.

Теперь каждый раз, когда вы создаете новый файл ресурсов, даже в одном проекте, Visual C++ определяет одни и те же _APS_NEXT_ значения. Это означает, что при добавлении нескольких диалоговых окон в двух разных файлах весьма вероятно, что одно и то же #define значение будет назначено разным .RC диалогам. Например, IDD_MY_DLG1 в первом .RC файле может быть назначено то же число, 101, что IDD_MY_DLG2 и во втором .RC файле.

Чтобы избежать этой проблемы, следует зарезервировать отдельный числовой диапазон для каждого из четырех доменов идентификаторов в соответствующих .RC файлах. Задайте диапазоны, вручную обновив _APS_NEXT значения в каждом из .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 файле, должен использовать #include для включения RESOURCE.H файла, как правило, из основного файла заголовка проекта. Это включение приводит к нежелательному побочным эффекту из-за внутреннего управления проектами среды разработки, которая сканирует исходные файлы для зависимостей заголовков. Каждый раз при добавлении нового символа в 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++ включает сведения

Как сказано выше, команда "Включение наборов" меню "Файл" позволяет задать три типа сведений.

  • Файл символов заголовка

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

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

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

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

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

TEXTINCLUDE Идентификатор ресурса Тип сведений "Включение наборов"
1 Файл символов заголовка
2 Директивы символов только для чтения
3 Директивы времени компиляции

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

Файл символов заголовка

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

#include "resource.h"

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

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h\0"
END

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

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

#include "afxres.h"

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

2 TEXTINCLUDE DISCARDABLE
BEGIN
   "#include ""afxres.h""\r\n"
   "\0"
END

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

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

#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

См. также

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