Программирование графики с использованием Direct3D

       

COM


Microsoft COM (Component Object Model) — это программная модель разработанная с целью позволить создание полностью переносимых компонентов, допускающих безопасное обновление. С точки зрения COM программные компоненты должны устанавливаться также легко, как и аппаратные. COM — основа некоторых API, таких как OLE и DirectX.

COM использует объектно-ориентированную модель, отличающуюся от модели, применяемой в таких языках как C++. Модель COM более строгая. Например, версия наследования в COM ограничена по сравнению с C++. Также COM-объекты не могут содержать открытых членов данных. Все взаимодействие с объектом должно осуществляться через функции-члены.

COM-компонент состоит из объекта и одного или нескольких интерфейсов посредством которых осуществляется доступ к объекту. Объект обеспечивает функциональность, предоставляемую COM-компонентом, но к нему нельзя обратиться напрямую. К COM-объектам всегда обращаются через интерфейсы. Один объект может поддерживать несколько интерфейсов. Рис. 3.1 иллюстрирует отношения объект/интерфейс.


Рис. 3.1. COM-объекты и интерфейсы

Рисунок иллюстрирует взаимодействие приложения с COM-объектом. Приложение использует COM-объект только через поддерживаемые объектом интерфейсы.

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

COM также поддерживает свойство, названное инкапсуляция времени существования (lifetime encapsulation). Инкапсуляция времени существования означает, что COM-объекты управляют своим собственным уничтожением. Когда объект обнаружит, что он больше не нужен, он уничтожит себя сам. Чтобы эта функция работала корректно, программы должны уведомлять объекты, при создании нового указателя на объект и при уничтожении указателя.

Все COM-объекты являются производными от COM-объекта IUnknown, предоставляющего три функции: AddRef(), Release() и QueryInterface().
Функции AddRef() и Release() увеличивают и уменьшают счетчик ссылок на объект. Функция QueryInterface() применяется для поиска дополнительных интерфейсов объекта (или определения того, что интерфейс не поддерживается данным объектом). Один из аргументов функции QueryInterface() — Глобальный Уникальный Идентификатор (GUID), который идентифицирует искомый интерфейс.

Все API DirectX построены на основе COM. Это, однако, не говорит о том, что вы должны быть профессионалом в COM, чтобы применять DirectX. Фактически, использование COM-объектов подобно использованию объектов C++. Ниже приведены некоторые правила, которые вам надо соблюдать при работе с COM.

  • COM-объекты и объекты C++ не могут быть производными друг от друга. Простейший способ получения класса C++ из COM-объекта, состоит во «внедрении» COM-объекта в классы C++ и написании функций-оболочек (wrapper functions) для каждой функции COM.


  • Каждый раз при создании копии указателя на COM-объект должна быть вызвана функция объекта AddRef() чтобы известить объект о создании дополнительной ссылки. Это не относится к созданию объекта. Обычно API DirectX выполняет эту работу за вас и включает вызов функции AddRef() в функцию, создающую COM-объект.


  • Каждый раз, когда указатель на COM-объект больше не нужен, должна быть вызвана функция объекта Release().


  • Функция QueryInterface() не всемогуща. Она возвратит интерфейсы объекта, только если объект поддерживает их. Попытка получить произвольные интерфейсы от объекта может потерпеть неудачу.


  • Если вы хотите узнать больше о COM, загрузите спецификацию с сайта Microsoft (www.microsoft.com).


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