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.