Обзор технологий СОМ, серверы и объекты СОМ, библиотеки


Модель COM (Component Object Model) представляет собой независимую от языка программирования спецификацию, базирующуюся на объектах. Эта спецификация определяет требования к созданию составных объектов (Component Objects) и механизм предоставления доступа к составным объектам, т.е. обеспечивает поддержку средств, разрешающих реализовывать объекты, которые могут вызываться между различными процессами и, даже, компьютерами. По определению СОМ является реализацией OLE.

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

Несколько интерфейсов могут быть реализованы одним объектом, несколькими независимыми или несколькими взаимосвязанными объектами.

Метод Querylnterface интерфейса lUnknown позволяет запрашивать интерфейсы объектов после получения указателя на объект-сервер.

Серверы и объекты COM

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

СОМ-объекты имеют и классы. Под классом в СОМ понимается конкретная реализация набора интерфейсов. Естественно, что любой СОМ-объект — это экземпляр определенного класса.

СОМ-объекты несколько более cложны: помимо класса они должны содержать фабрику класса (class factory) ДЛЯ создания новых объектов и, по возможности, библиотеку типов (type library) для описания классов и интерфейсов, реализуемых этим объектом.

Бинарный стандарт, используемый в СОМ, — это таблица виртуальных методов, ничем ни отличающаяся от VMT в Delphi.

Библиотека СОМ

В любой системе, поддерживающей СОМ, обязательно имеется некоторая реализация библиотеки СОМ, инициализируемая функцией Colnitialize(Nil). Эта библиотека включает функции, предоставляющие базовые сервисы объектам и их клиентам, а также способ запуска серверов объектов. Доступ к сервисам библиотеки СОМ осуществляется через вызовы обычных функций, а не методов интерфейсов СОМ-объектов. Обычно имена функций библиотеки СОМ начинаются с «Со», например, CoCreatelnstance.

Delphi включает в свой состав две библиотеки OLE32.DLL и OLE-AUT32.DLL, реализующие базовые интерфейсы и общие функции СОМ.

Возвращаемый тип функций в СОМ

В программах, использующих технологию СОМ, большинство методов-функций возвращает результат типа HResult (handle to a result). Тип HResult дает значение (0 или 1) в 31 разряде, которое свидетельствует о том, успешно ли завершилось выполнение операции или нет, причем в последнем случае переданное значение содержит код ошибки (0-15 разряды HResult). При этом: разряды с 16 по 26 определяют группы ошибок.

В программе для работы с СОМ типовым является следующий фрагмент программного кода, обрабатывающего ошибки вызова методов:

If Failed(<MyComObject>.<SomeFunctiori>) Then Begin ShowMessage(‘Ошибка COM!’); Exit;
End;

Однако в Delphi механизм обработки ошибок предполагает разделение значения, возвращаемого функцией, и обработку исключительной ситуации. Для этих целей в Delphi в .блоке ComObj предусмотрена процедура OleCheck, которая иначе позволяет реализовать обращение к методам интерфейсов:

OleCheck(<MyComObject>.<SomeFunction>);

Если не заключать функции в процедуру OleCheck, то в случае ошибки будет выдаваться непонятное сообщение об ошибке, в то время как OleCheck использует модуль ActiveX для вывода осмысленного сообщения об ошибке.

Повторное применение СОМ

Одна из основных задач СОМ — продвижение повсеместного и эффективного повторного использования существующего кода. Вместо механизма наследования реализации, который может привести к непредсказуемым эффектам в неоднородной программной среде, СОМ предлагает два других механизма: включение и агрегирование.
а) Включение (containment), называемое также делегированием, предполагает наличие двух объектов: внутреннего и внешнего. Внешний объект пользуется для выполнения некоторых методов внутренним объектом, используя для этого свои внутренние вызовы. Внутренний объект полностью отгорожен от клиента. Этот механизм очень прост и эффективен, однако при большом числе включений для вызова конкретной реализации может понадобиться пройти по цепочке несколько объектов.

б) Агрегирование (aggregation) предполагает возможность доступа клиента к интерфейсам внутреннего объекта напрямую, т.е. внутренний объект является дополнением внешнего. Во внешнем объекте фактически методы внутреннего объекта дополняются новыми интерфейсами. Однако агрегирование не невидимо для участвующих в нем объектов. В отличие от включения агрегирование требует поддержки со стороны внутреннего объекта. Для ЭТОЙ цели он должен быть соответствующим образом создан. При совместном функционировании могут возникать проблемы при правильном подсчете ссылок и обеспечении правильной работы метода IUnknown.Querylnterface.

Для поддержки агрегирования в Delphi в блоке ComObj предусмотрен класс TAggregatedObject — наследник от класса TObject, а в базовом классе TComObject введен конструктор CreateAggregated для создания агрегированного объекта. Для реализации внутренних (агрегированных) объектов в блоке ComObj предусмотрен класс TContainedObject.

Кроме того, СОМ поддерживает наследование интерфейса — передачу только объявления методов. Код реализации потомок предоставляет самостоятельно.


Комментарии запрещены.




Статистика