Architecture Net

Атрибуты C++


Visual C++.NET поддерживает использование атрибутов, позволяющих создавать Обычный неуправляемый код, такой, как компоненты модели компонентных объектов Microsoft (COM), даже с меньшими усилиями, чем раньше. Кроме того, Visual C++.NET Поддерживает новые возможности .NET, такие, как Унифицированная модель событий (Unified Event Model). Изначально атрибуты, относящиеся к модели компонентных объектов Microsoft (COM), использовались в отдельном файле IDL (Interface Definition Language — язык описания интерфейсов) для описания информации о типе компонентов Модели компонентных объектов Microsoft (COM). Теперь же эти атрибуты можно использовать непосредственно в исходном коде C++, поэтому необходимость в отдельном файле IDL отпадает. Компилятор использует эти атрибуты для генерации исполняемого Кода и информации о типе. Одно из преимуществ применения атрибутов C++ для программирования с использованием модели компонентных объектов Microsoft (COM) со-СТоит в том, что вам придется возиться только с исходными файлами C++, но не с фай-Дами IDL или RGS (Registry Script — Сценарий системного реестра). Это делает проекты С компонентами на основе модели компонентных объектов Microsoft (COM) более простыми и понятными.
Использование атрибутов значительно изменяет язык C++ и расширяет возможности Модульности программ. Источники атрибутов, в качестве которых могут выступать независимые динамически подключаемые библиотеки (DLL), реализуют механизм динамического расширения возможностей компилятора C++. Атрибуты предназначены для по-Ьышения производительности труда программистов, особенно при разработке компонентов на основе модели компонентных объектов Microsoft (COM). Генерируемый при Использовании атрибутов код автоматически вставляется в конечный файл. Атрибуты используются для создания кода таких элементов:

  • интерфейсы и компоненты на основе модели компонентных объектов Microsoft (СОМ);
  • события модели компонентных объектов Microsoft (COM) (точки стыковки);
  • события унифицированной модели событий (управляемые события);

  • код ATL Server;


  • код пользователя OLE для баз данных;


  • код со счетчиками производительности;


  • входные точки модулей.


  • Хотя данная глава называется "Программирование на управляемом C++", а атрибуты используются при создании управляемого кода, в этом разделе мы рассмотрим лишь использование атрибутов для создания неуправляемого кода на основе модели компонентных объектов Microsoft (COM). Информацию об использовании атрибутов при работе с управляемыми событиями можно найти в разделе этой главы "События". Информацию об использовании атрибутов для других целей можно найти в документации по комплексу инструментальных средств разработки программ .NET ( NET SDK). Атрибуты, определяемые разработчиком, рассмотрены в главе 8 "Классы каркаса .NET Framework".
    Продемонстрируем необходимость использования атрибутов в C++ на примере описания функции AddEmUp, приведенного в следующей строке кода. Заметим, что в рамках ANSI C++ эта функция не может быть описана полностью. Так, невозможно указать, какие из аргументов являются входными, а какие — выходными Обычно эта дополнительная информация, важная при создании кода на основе модели компонентных объектов Microsoft (COM), использующего маршалинг, описывается с помощью атрибутов языка описания интерфейсов (IDL) в отдельном файле IDL. При этом атрибуты языка описания интерфейсов (IDL) заключаются в квадратные скобки и могут использоваться для описания многих черт компонентов на основе модели компонентных объектов Microsoft (СОМ), в том числе интерфейсов, соклассов и библиотек типов.

    // нет важной информации маршалинга
    HRESULT AddEmUp (int i, int j, int.* psum) ;

    Приведенную функцию C++ можно описать более подробно в файле IDL, как это показано ниже. Здесь используются атрибуты in (входной), out (выходной) и retval.

    .HRESULT AddEmUp(
    [in]int i, [in]int 3, [out,retval]int *psum);



    Для синтаксического разбора файла IDL, создания библиотек типов и исходных файлов, использующих маршалинг (для заместителя (proxy) и заглушки (stub)), для методов интерфейса модели компонентных объектов Microsoft (COM) (поддерживаются также интерфейсы удаленного вызова процедур (RPC)) используется компилятор языка описания интерфейсов IDL, разработанный фирмой Microsoft, — Midi. exe.
    Добавлять атрибуты в исходный код можно вручную Однако полезно будет увидеть, как атрибуты вставляются в проект, генерируемый Мастером приложений библиотеки шаблонных классов (ATL) на основе модели компонентных объектов Microsoft (COM) (ATL COM Application Wizard), который является высокопроизводительным инструментальным средством, предназначенным для создания компонентов на основе модели компонентных объектов Microsoft (COM). На рис. 3.4 показано, как разрешить использование атрибутов в Мастере приложений библиотеки шаблонных классов (ATL) на основе модели компонентных объектов Microsoft (COM) (ATL COM Application Wizard).





    Рис. 3.4. Окно ATL Project Wizard ( Мастер проектов на основе библиотеки шаблонных классов (ATL)) с установленным флажком Attributed

    Следующий фрагмент кода взят из файла MyATLProject, созданного Мастером проектов на основе библиотеки шаблонных классов (ATL) (ATL Project Wizard) при установленном флажке Attributed Обратите внимание, что атрибут module (модуль) применен к проекту в целом, благодаря чему в проекте автоматически генерируются функции DllMain, DllRegisterServer и DllUnregisterServer.

    // MyATLProject.срр: Реализация экспорта динамически
    // подключаемой библиотеки (DLL).
    #include "stdafx.h"
    #include "resource.h"
    // Атрибут module (модуль) вызывает автоматическую генерацию
    // DllMain, DllRegisterServer и DllUnregisterServer
    [ module(dll, uuid = "{50434D6D-AAEA-405C-AC49-B9CA769E5D6D}",

    // модуль
    name = "MyATLProject", // название
    helpstring = "MyATLProject 1.0 Type Library",
    // Библиотеки Типа
    resource_name = "IDR_MYATLPROJECT") ];

    На рис 3 5 показано использование Мастера простых объектов на основе библиотеки шаблонных классов (ATL) (ATL Simple Object Wizard) для добавления к проекту простого класса на основе модели компонентных объектов Microsoft (COM), называющегося MyATLClass.



    Рис. 3.5. ATL Simple Object Wizard (Мастер простых объектов на основе библиотеки шаблонных классов (ATL))

    Мастер простых объектов на основе библиотеки шаблонных классов (ATL) (ATL Simple Object Wizard) добавит приведенный ниже исходный код с атрибутами в файл MyAtlClass .h, а не в файл IDL. Обратите внимание, что атрибуты object (объект), uuid (universally unique identifier— универсальный уникальный идентификатор) и dual (двойной) используются для описания интерфейсов, а атрибуты coclass, progid (программный идентификатор) и version (версия)— для описания классов на основе модели компонентных объектов Microsoft (COM). Эти атрибуты находятся непосредственно в исходном коде C++, поэтому файл IDL не нужен.
    // IMyAtlClass
    [
    object, // объект



    uuid("lF9401D8-58BF-469D-845B-A2069CBAFC84") ,
    dual, helpstring("IMyAtlClass Interface"), // двойной, Интерфейс
    pointer_default(unique) // уникальный
    ]
    _interface IMyAtlClass : IDispatch // интерфейс
    {
    };
    // CMyAtlClass
    [
    coclass,
    threading("apartment") ,
    vi_progid("MyATLProject.MyAtlClass"),
    progid("MyATLProject.MyAtlClass.1"), // программный идентификатор
    version(1.0), // версия
    uuid("B3321AD5-3ACE-4820-B134-35FD67120A48"),
    helpstring("MyAtIClass Class") // Класс
    {
    class ATL_NO_VTA5LE CKyAtlClass : // классс
    public IMyAtlClass
    {
    public:
    CMyAtlClass()
    {
    }
    DECLARE_PROTECT_FINAL_CONSTRuCT()
    HRESULT FinalCor.struct ()
    {
    return S_OK;
    }
    void FinalReiease()
    {
    }
    public:
    };

    В приведенном коде используется атрибут сoсlass, но при этом опущена некоторая информация, присутствующая в коде, сгенерированное прежними версиями АТ!_. Например, отсутствуют карты объектов, карты интерфейсов и сценарии системного реестра. Атрибут coclass обеспечивает все эти, казалось бы, пропущенные возможности. Пропущенный код будет автоматически добавлен компилятором при обработке атрибута coclass.
    На рис. 3.6 показан диалог Add Method (Добавление метода), используемый для добавления метода AadEmUp. Обратите внимание на указание атрибутов in (входной), cut (выходной)и retval.
    Они обусловливают добавление в файл KyAr iciass . h приведенного ниже кода. Еще раз обратим ваше внимание на то, что атрибуты используются и исходном файле СРР, а не в отдельном файле IDL.
    Создание простого проекта на основе библиотеки шаблонных классов ATL (Simple ATL Project)

    Создайте проект на основе ATL Server (ATL Server Project):

    1. Выберите пункт меню Fiie => New (Файл => Создать). Откроется диалог New Project (Создание проекта).
    2. Выберите Visual C++ Projects (Проекты на Visual C++) в окне Project Types (Типы проектов).
    3. Выберите ATL Project (Проект на основе библиотеки шаблонных классов ATL) в окне Templates (Шаблоны).
    4. Введите MyATLProject в поле Name (Название)
    5. Задайте в поле Location (Расположение) папку, в которой будет сохранен проект.
    6. Щелкните на кнопке ОК для вызова Мастера проектов на основе библиотеки шаблонных классов (ATL) (ATL Project Wizard).
    7. Выберите вкладку Application Settings (Параметры приложения).
    8. Убедитесь, что флажок Attributed установлен.
    9. Щелкните на кнопке Finish (Готово). Создайте простой объект на основе библиотеки шаблонных классов (ATL):
    10. Выберите пункт меню Project => Add Class (Проект => Добавить класс). Откроется диалог Add Class (Добавление класса).
    11. Выберите ATL Simple Object (Простой объект на основе библиотеки шаблонных классов (ATL)) в качестве шаблона (Template).
    12. Щелкните на кнопке Open (Открыть) для вызова Мастера простых объектов на основе библиотеки шаблонных классов (ATL) (ATL Simple Object Wizard).
    13. Введите MyAtlClass в поле Short name (Короткое название).
    14. Щелкните на кнопке Finish (Готово) для создания проекта.
    Добавьте метод в простой объект на основе библиотеки шаблонных классов (ATL):
    15. Щелкните правой кнопкой на интерфейсе IMyAtlClass в окне Class View (Просмотр классов).
    16. Выберите пункт меню Add => Add Method (Добавить => Добавить метод). Откроется Мастер добавления методов (Add Method wizard).
    17. В качестве названия метода введите AddEmUp в поле Method name (Название метода).
    18. Выберите LONG в списке Parameter type (Тип параметра).
    19. В качестве имени параметра введите i в поле Parameter name (Имя параметра).
    20. Установите флажок in (входной).
    21. Щелкните на кнопке Add (Добавить).
    22. Выберите LONG в списке Parameter type (Тип параметра).
    23. В качестве имени параметра введите j в поле Parameter name (Имя параметра).
    24. Установите флажок in (входной).
    25. Щелкните на кнопке Add (Добавить).
    26. Выберите LONG в списке Parameter type (Тип параметра).
    27. В качестве имени параметра введите psum в поле Parameter name (Имя параметра).
    28. Установите флажки out (выходной) и retval.
    29. Щелкните на кнопке Add (Добавить).
    30. Щелкните на кнопке Finish (Готово).





    Рис. 3.6. Диалог Мастера добавления методов ( Add Method wizard) позволяет указать атрибуты параметра

    // IMyAtlClass
    [
    object, // объект
    uuid("lF9401D8-58BF-469D-845B-A2069CBAFC84") ,
    dual, helpstring("IMyAtlClass Interface"), // двойной,
    // интерфейс
    pointer_default(unique) // уникальный
    ]
    _interface IMyAtlClass : IDispatch // интерфейс
    [id(l), helpstring("method AddEmUp")] HRESULT AddEmUp([in]
    LONG i, [in] LONG j, [out,retval] LONG* psum);
    };

    Единственное, что осталось сделать в рассматриваемом примере, — вручную реализовать метод AddEmUp в файле MyAtlClass . cpp и скомпилировать приложение. Реализация этого метода приведена ниже

    STDMETHODIMP CMyAtlClass::AddEmUp(LONG i, LONG ], LONG* psum)

    {
    // TODO: Add your implementation code here
    // TODO: Добавьте ваш код реализации здесь
    *psum = i+j; // добавлен вручную
    return S_OK;
    }

    Создав приложение, его можно протестировать с помощью программы-клиента на основе моде in компонентных объектов Microsoft (COM) Мы не будем рассматривать здесь как это можно Lделать поскольку создание такой программы предполагает применение обычного стиля программирования на устаревшем Visual Basic или Visual C++ Для полччения более подробной информации оекомендлем обратиться к документации по Visual Studio или к любой из множества отличных книг в этой области (например, Understanding and Programming СОМ+, написанной Робертом Дж Обергом (Robert J. Oberg))

    CompEbook.ru Железо, дизайн, обучение и другие


    Содержание раздела