Модель программирования Component Object Model. Разработка COM-сервера

Страницы работы

51 страница (Word-файл)

Содержание работы

Модель программирования COM

Модель программирования COM компонентных объектов (Component Object Model — COM) представляет собой стандарт, унифицирующий разработку системы объектов. Модель специфицирует следующее:

¨  Правила, по которым объекты создаются и уничтожаются (управление жизненным циклом).

¨  Правила, по которым объекты структурируются и особым образом располагаются в памяти.

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

COM-объекты (часто называемые компонентами) — это объекты класса C++, который подчиняется спецификациям COM. Авторы COM выделили набор функций, которые являются общими для всех COM-объектов, эти функции определены в документации как набор стандартных интерфейсов COM. Стандартные интерфейсы находятся в файлах заголовков OLE.

COM-объекты можно писать на любом языке, который поддерживает указатели на указатели (void**), включая C и C++. Объект C++ становится сервером, если он соответствует следующим требованиям:

¨  Реализует набор функций, которые определены в спецификации COM.

¨  Имеет CLSID.

¨  COM-сервер зарегистрирован в системе (информация о нем помещена в системный реестр).

Для взаимодействия с COM-сервером клиент получает указатель на один из его интерфейсов. Клиент запрашивает интерфейс по имени. Получив указатель на интерфейс, клиент вызывает его методы.

COM-интерфейс – это только описания функций, он представляет собой набор чисто виртуальных методов C++, связанных семантически.

COM-интерфейс представляет собой абстрактный класс C++, который определяет неизменяемое, строго типизированное взаимодействие между клиентами и COM-серверами.

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

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

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

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

Когда клиент хочет использовать COM-сервер, он говорит библиотекам OLE: «Загрузите сервер, чей CLSID (идентификатор, хранимый в реестре) равен XXX, и предоставьте мне доступ к интерфейсу YYY». В ответ на этот запрос библиотеки OLE вызывают программу системного уровня под названием SCM (Service Control Manager – менеджер сервисов), которая запускается во время загрузки системы. SCM является RPC-сервером, который использует системный реестр, чтобы выполнить поиск реализации, т.е. отыскать EXE- или DLL-файл, содержащий требуемый COM-сервер.

Когда создаются COM-серверы, они обычно реализуются в виде либо EXE-, либо DLL-файлов. Те из них, которые хранятся в EXE-файлах, называются локальными (local) серверами, а те, которые хранятся в DLL-файлах называются внутризадачными (in-process) серверами.

Чтобы найти исполняемый модуль, в котором находится сервер, SCM ищет в системном реестре требуемый CLSID. Если соответствующий CLSID был найден, то SCM возвращает библиотекам OLE связанное с ним имя модуля, и библиотеки, в свою очередь, загружают этот модуль в память.

¨  Если COM-сервер находится в DLL-файле, библиотеки OLE передают клиенту указатель на фабрику классов сервера.

¨  Если COM-сервер находится в EXE-файле, библиотеки OLE запускают программу, устанавливают RPC-канал между заместителем клиента и посредником сервера и возвращают интерфейсный указатель клиенту.

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

Сложности с локальными или удаленными серверами

Клиенты и локальные серверы могут существовать в отдельных процессах. Клиенты и серверы имеют различные адресные пространства, поэтому им нужен «коммуникационный мост», чтобы вызывать функции и передавать друг другу данные. Такой мост обеспечивают библиотеки OLE и используют механизм RPC (Remout Procedure Call – удаленный вызов процедуры) в качестве средства его реализации.

Похожие материалы

Информация о работе