Атрибуты C++ для модели COM и .NET

Корпорация Майкрософт определяет набор атрибутов C++, упрощающих программирование COM и платформа .NET Framework разработку среды CLR. При добавлении атрибутов в исходные файлы компилятор работает с библиотеками DLL поставщика для вставки кода или изменения кода в созданных файлах объектов. Эти атрибуты помогают создавать файлы IDL, интерфейсы, библиотеки типов и другие com-элементы. В интегрированной среде разработки (IDE) атрибуты поддерживаются мастерами и окно свойств.

Хотя атрибуты устраняют некоторые подробные коды, необходимые для записи COM-объектов, для их лучшего использования требуется фон в основах COM.

Примечание.

Если вы ищете стандартные атрибуты C++, см. раздел "Атрибуты".

Назначение атрибутов

Атрибуты расширяют C++ в направлениях в настоящее время, не нарушая классическую структуру языка. Атрибуты позволяют поставщикам (отдельным библиотекам DLL) динамически расширять функциональные возможности языка. Основной целью атрибутов является упрощение разработки компонентов COM, а также повышение производительности разработчика компонентов. Атрибуты можно применять практически к любой конструкции C++, например к классам, элементам данных или функциям-членам. Ниже приведены основные преимущества, предоставляемые этой новой технологией:

  • Предоставляет знакомое и простое соглашение о вызовах.

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

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

  • Заменяет большой объем кода IDL, необходимый компонентом COM, несколькими краткими атрибутами.

Например, чтобы реализовать простой приемник событий для универсального класса ATL, можно применить атрибут event_receiver к конкретному классу, например CMyReceiver. Затем event_receiver атрибут компилируется компилятором Microsoft C++, который вставляет правильный код в файл объекта.

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

Затем можно настроить методы handler1 и handler2 обрабатывать события (с помощью встроенной функции __hook) из источника событий, который можно создать с помощью event_source.CMyReceiver

Основные принципы работы атрибутов

Существует три способа вставки атрибутов в проект. Сначала их можно вставить вручную в исходный код. Во-вторых, их можно вставить с помощью сетки свойств объекта в проекте. Наконец, их можно вставить с помощью различных мастеров. Дополнительные сведения об использовании окна "Свойства" и различных мастерах см. в разделе "Проекты Visual Studio — C++".

Как и раньше, при создании проекта компилятор анализирует каждый исходный файл C++ и создает файл объекта. Однако при обнаружении атрибута компилятор анализируется и синтаксически проверяется. Затем компилятор динамически вызывает поставщика атрибутов для вставки кода или внесения других изменений во время компиляции. Реализация поставщика отличается в зависимости от типа атрибута. Например, атрибуты, связанные с ATL, реализуются atlprov.dll.

На следующем рисунке показана связь между компилятором и поставщиком атрибутов.

Diagram showing component attribute communication.

Примечание.

Использование атрибутов не изменяет содержимое исходного файла. Единственный раз, когда код созданного атрибута отображается во время сеансов отладки. Кроме того, для каждого исходного файла проекта можно создать текстовый файл, отображающий результаты подстановки атрибутов. Дополнительные сведения об этой процедуре см. в разделе /Fx (Слияние внедренного кода) и внедренного кода отладки.

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

Сборка атрибутированной программы

После добавления атрибутов Visual C++ в исходный код может потребоваться, чтобы компилятор Microsoft C++ мог создавать библиотеку типов и IDL-файл. Следующие параметры компоновщика помогают создавать TLB и IDL-файлы:

Некоторые проекты содержат несколько независимых IDL-файлов. Они используются для создания двух или более TLB-файлов и при необходимости привязки их к блоку ресурсов. Этот сценарий в настоящее время не поддерживается в Visual C++.

Кроме того, компоновщик Visual C++ выводит все сведения о атрибутах, связанных с IDL, в один MIDL-файл. Невозможно создать две библиотеки типов из одного проекта.

Контексты атрибутов

Атрибуты C++ можно описать с помощью четырех основных полей: целевой объект, к которым они могут применяться (применяется к), если они повторяются или нет (повторяются), необходимое присутствие других атрибутов (обязательные атрибуты) и несовместимости с другими атрибутами (недопустимые атрибуты). Эти поля перечислены в сопутствующей таблице в справочных разделах каждого атрибута. Каждый из этих полей описан ниже.

Применяется к

В этом поле описываются различные элементы языка C++, которые являются юридическими целевыми объектами для указанного атрибута. Например, если атрибут указывает "класс" в поле "Область применения ", это означает, что атрибут может применяться только к юридическому классу C++. Если атрибут применяется к функции-члену класса, будет возникать синтаксическая ошибка.

Дополнительные сведения см. в разделе "Атрибуты по использованию".

Повторяемый

Это поле указывает, может ли атрибут многократно применяться к одному целевому объекту. Большинство атрибутов не повторяются.

Обязательные атрибуты

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

Недопустимые атрибуты

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

Отладка внедренного кода

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

  • Это можно сделать в окне Дизассемблированный код.

  • Можно создать объединенный исходный файл, содержащий и оригинальный, и введенный коды, с помощью /Fx.

Окно Дизассемблированный код показывает инструкции на ассемблере, соответствующие и исходному коду, и коду, введенному атрибутами. Кроме того, в окне Дизассемблированный код могут быть показаны примечания исходного кода.

Включение комментирования исходного кода

  • Щелкните правой кнопкой мыши окно Дизассемблированный код и выберите команду в контекстном меню Показать исходный код.

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

Просмотр введенного кода

  1. Отладчик должен находиться в режиме приостановки выполнения.

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

  3. Щелкните правой кнопкой мыши и выберите в контекстном меню команду Перейти к дизассемблированию.

    Если атрибут находится недалеко от текущей точки выполнения, можно выбрать окно Дизассемблированный код в меню Отладка.

Просмотр дизассемблированного кода в текущей точке выполнения

  1. Отладчик должен находиться в режиме приостановки выполнения.

  2. В меню Отладка выберите Окна и нажмите кнопку Дизассемблированный код.

В этом разделе

Атрибутивное программирование. Часто задаваемые вопросы
Список атрибутов по группам
Список атрибутов по использованию
Алфавитный указатель атрибутов