Модель программирования 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 – удаленный вызов процедуры) в качестве средства его реализации.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.