Добавлен: 06.04.2023
Просмотров: 101
Скачиваний: 1
Введение
В данной работе кратко рассмотрена технология COM, которая в настоящее время широко применяется при разработке программного обеспечения, интеграции программных продуктов в единые информационные системы. Целью разработки COM-технологии являлось стремление к интеграции программного обеспечения через стандартизацию механизмов взаимодействия программных модулей между собой. На основе данной технологии, которая является масштабируемой, разработано огромное число технологий, которые стали стандартами в разнообразных сферах применения информационных технологий – от управления технологическими процессами в промышленности до домашних персональных компьютеров. Массовое применение COM отчасти связано с мощью ее разработчика, фирмы Microsoft. С этим приходится считаться, и каждый программный продукт, выпущенный под платформу Windows, для достижения коммерческого успеха обязан соответствовать инновациям Microsoft.
Обзор COM-технологии
Технология COM (Component Object Technology) – объектно-ориентированная программная спецификация, предложенная Microsoft. COM предназначена для повышения надежности взаимодействия программных продуктов между собой. Данная технология не определяет структуру программного продукта, язык программирования и прочие детали реализации. COM является стандартом, который регламентирует модель программного объекта, соответствующий требованиям COM-технологии. Программный объект, созданный согласно спецификации COM называется COM-объектом. Данная технология определяет механизм взаимодействия COM-объектов между собой. COM относится к так называемым двоичным стандартам, т.к. прилагается к оттранслированному в двоичный код программному объекту. Взаимодействие COM-объектов обеспечивается набором предопределенных подпрограмм, называемыми интерфейсами, доступ к которым обеспечивается через уникальные идентификаторы интерфейсов GUID (Global Unique Interface Identifyer), уникальность которых гарантирует операционная система. Такой механизм схож с использованием указателей при доступе к объектам в объектно-ориентированных языках программирования, что дает возможность прозрачного управления объектами, т.к. доступ к ним обеспечивается через указатели. COM-технология расширяет этот механизм, перенося применение указателей (в виде GUID) для доступа к объектам на уровень операционной системы. Таким образом, COM-объекты могут быть прозрачно друг для друга модифицироваться, т.к. доступ к объектам обеспечивается через GUID. COM технология включает в себя также библиотеку, в которой содержится набор стандартных интерфейсов, которые определяют ядро функциональности COM и небольшой набор API функций, разработанных для создания COM-объектов и управления ими.
Архитектура COM является расширяемой, и на ней базируются другие технологии Microsoft, такие как OLE и ActiveX. Эти технологии в настоящее время являются расширениями операционной системы, и определяют свои собственные правила работы и предлагают свои библиотеки для создания объектов и для управления объектами на основе данных технологий. Используя COM как основу, разработчики программного обеспечения получают возможность создавать свои собственные расширения таким образом, что программные объекты созданные, по правилам COM-технологии могут работать с другими COM-объектами через унифицированный механизм взаимодействия, который предлагает COM.
COM использует такое понятие как «класс», которое по смыслу означает то же самое, что и в объектно-ориентированных средствах разработки. COM-объект является объектом COM-класса (COM class). COM-классы, для различия с классами в объектно-ориентированных языках, с помощью которых может создаваться приложение, обычно называются соклассами (CoClass). Далее в тексте будет использоваться терминология, исходящая из объектно-ориентированного программирования.
Состав COM-объекта
В COM-технологии различаются следующие строительные блоки, используемые для создания объектов:
- Interface (COM-интерфейс) - множество прототипов функций (методов), чисто определенных. Термин «чисто определенный метод» или «абстрактный метод» исходит теории объектно-ориентированного анализа, и означает, что в определении класса отсутствует реализация метода, а присутствует только его определение. От такого класса нельзя создавать объекты. Его предназначение – описать фундаментальные общности для всех производных классов;
- COM object (COM-объект) – объект класса CoClass, который содержит реализацию COM интерфейса;
- COM/ActiveX server (COM сервер или ActiveX сервер)– модуль, такой как EXE, DLL или OCX, который содержит машинный код COM или ActiveX объектов;
- Class factory (фабрика классов)– объект, который может создавать COM-объекты из CoClass;
- Type library (библиотека типов) – файл, содержащий информацию о типах данных, которые использует COM/ActiveX сервер.
Интерфейсы являются основными строительными единицами COM. Они объединяются на семантически связанные группы подпрограмм, через которые COM-объекты осуществляют взаимодействие:
COM определяет следующие ключевые аспекты, связанные с COM-интерфейсами:
- Методы интерфейса абстрактны (чисто определены). Интерфейс представляет собой набор прототипов методов, чье назначение состоит только в определении интерфейса. Определения прототипов методов включает в себя определения числа и типов передаваемых значений, возвращаемого значения, а также ожидаемого поведения объекта. Как методы реализованы, в определение интерфейса не включается. Таким образом, реализуется полиморфизм интерфейса, т.к. каждый потомок, наследующий интерфейс, может включать собственную реализацию метода;
- Интерфейс подчиняется двоичному стандарту. Так как все методы интерфейса абстрактны, интерфейс представлен как указатель на vtable (virtual table). Каждая запись в vtable представляет собой ссылку на соответствующий метод класса, который содержит реализацию интерфейса. Определение интерфейса как указателя устанавливает протокол для доступа к COM-объекту, который является двоичным. Таким образом, получение доступа к реализации метода интерфейса объекта представляет собой через последовательную процедуру получения указателей:
С GUID система связывает указатель на интерфейс. Указатель на интерфейс, в свою очередь является указателем на vtable, через которую обеспечивается указатель на таблицу указателей на код с реализациями методов. Множество объектов одного класса в системе используют одну общую vtable, и для каждого такого объекта создается структура с частными данными, необходимыми для корректного вызова функций.
- Интерфейс включает в себя определенную функциональность. Методы интерфейса семантически связаны по функциональности и назначению. Согласно этому, методы интерфейса обычно именуется согласно своему назначению, и имя предваряется заглавной I. Для примера, метод IMalloc предназначен для размещения и освобождения памяти;
- Интерфейс имеет уникальный идентификатор. Интерфейсы различаются посредством использования глобальных идентификаторов GUID, которые используются для ссылки на идентификаторы конкретных интерфейсов IID (Interface Identifier). Каждый интерфейс имеет свой IID, и при регистрации в системе получает связанный с ним GUID. Использование GUID более совершенно, чем использование символьных имен, т.к. гарантирует отсутствие конфликтов имен при обновлении программных продуктов (выхода новых версий) и при использовании программного обеспечения от различных производителей;
- Интерфейс не может измениться после регистрации в системе. Каждый интерфейс предназначен для выполнения определенной задачи, и определяет, какие данные поступают на обработку и какие данные выводятся. Таким образом, после того, как интерфейс опубликован в системе, и стал доступен для использования, он не должен меняться. Любое изменение в семантике интерфейса ведет к необходимости оявления нового интерфейса. Однако существует возможность безопасной реализации многоинтерфейсных объектов посредством использования для доступа к разным версиям интерфейса разные IID.
- Интерфейсы наследуют функциональность от одного базового предка. Все интерфейсы прямо или косвенно являются потомками интерфейса IUnknown. Этот интерфейс обеспечивает базовую функциональность интерфейса, которая включает в себя динамический опрос объекта (dynamic quering) и управление жизненным циклом объекта (lifetime managment). Эта функциональность обеспечивается тремя методами интерфейса IUnknown: QueryInterface, AddRef и Release. Каждый класс, который реализует интерфейс, должен реализовать эти три метода, наряду с методами, унаследованные от другого интерфейса, и своими собственными методами. Ниже представлено краткое описание функционального назначения упомянутых методов:
- QueryInetrface обеспечивает опрос объекта и доступ к указателю на интерфейс. QueryInerface является первой записью в vtable, и предлагает эффективный путь для определения возможностей объекта, в простейшем случае через этот метод при установлении связи обеспечивается передача указателя на интерфейс IUnknown тому объекту, который пытается получить доступ к данному объекту. Данный метод также делает возможным обновление COM объекта без потерь на обновление остальных зависимых объектов, т.к. объект может быть динамически опрошен клиентами через указатель на IUnknown. Это функция носит название dynamic quering;
- AddRef и Release находятся на втором и третьем местах в vtable. Это простые счетные функции, которые предоставляются для управления временем жизни объекта. Пока внутренний счетчик объекта, отражающий количества раз вызова AddRef и Release больше нуля (вызов AddRef может увеличивать его значение), объект остается в памяти. Как только значение счетчика достигает нуля (вызов Release может уменьшать его значение), реализация интерфейса может безопасно удалить все зависимые нижележащие объекты. Это функция носит название lifetime managment;
COM-объект – это объект CoClass, который является классом, реализующим один или более интерфейсов. COM-объект предоставляет функции, которые доступны через указатель на один из его интерфейсов. Всвязи с этим, COM-объект обладает следующими особенностями:
- COM-объект защищен от прямого изменения внешними программами в своих данных, т.к. доступ к COM-объекту возможен только через указатель на интерфейс;
- COM-объект может быть использован приложениями, реализованными практически на любых современных средствах разработки приложений (алгоритмических языках), с любой внутренней организацией приложения, главное, чтобы средство разработки позволяло работать с указателями на структуры, на массивы и на функции.
Объект COM-класса должен иметь в своем составе фабрику классов, и идентификатор класса CLSID (Class Identifier), так чтобы COM-объект мог быть создан на основе существующего модуля.
COM-сервер – это приложение, или библиотека, предоставляющее определенный набор сервисных функций для клиентских приложений или библиотек.
COM-сервер состоит из COM-объектов. Например, COM-сервер, который включает в себя код элементов управления ActiveX (ActiveX control)– является ActiveX-сервером. Для разработчика имеется большое число библиотек, которые можно использовать для создания COM-объектов. В качестве примера можно привести библиотеку Microsoft Active Template Library, предоставляющую набор шаблонов, на основе которых можно создавать свои собственные программные продукты, построенные по COM-технологии. Например, шаблон для COM-сервера включает в себя код для основных функций, которые должен обеспечивать COM-сервер: регистрация сервера в системе, загрузка/выгрузка сервера, создание объектов, управления фабриками классов, обеспечение выдачи информации о сервере, включая: тип сервера, help-файл, имя сервера, библиотека типов и т.д.
Клиенты не должны знать, каким образом сервер выполняет свои функции, и клиенты не должны знать, где сервер находится – все взаимодействие осуществляется через указатели на интерфейс сервера. COM-сервер может быть следующих типов:
- In-process server (внутренний сервер) – программный DLL модуль, работающий в рабочем пространстве памяти клиентского приложения:
- Local server (локальный сервер) – программный EXE модуль, работающий в отдельном адресном пространстве;
- Remote server (удаленный сервер) – программный EXE модуль, работающий на удаленной машине:
Разница между внутренним и удаленным серверами в том, какой тип межпроцессной связи используется. В данном случае существует необходимость использования посредников, которые обеспечивают передачу параметров и вызов функций. Такой механизм называется маршаллингом (marshalling). Т.к. в случае, когда клиент и сервер находятся в разных адресных пространствах, доступ к ресурсам не может быть осуществлен непосредственно через указатели. Поэтому посредники со стороны клиента (proxy) осуществляют упаковку аргументов в пакеты маршаллинга (marshalling packets), и обеспечивают удаленный вызов процедур (Remote Procedure Call). Посредник со стороны сервера (stub) реализуют распаковку параметров, и помещение их в стек. Далее осуществляется вызов непосредственно реализации метода. По сути, сервер создает клиентский вызов процедуры в своем собственном адресном пространстве.
Посредники используют COM-средства, для осуществления взаимодействия в разных процессах. Для взаимодействия объектов, находящихся на разных машинах, используются средства расширения COM – распределенная COM (Distributed COM или DCOM). COM предлагает стандартный механизм маршаллинга – интерфейс диспетчеризации (Dispatch Interface).
Фабрики классов
Фабрики или производители классов (class factories) - специальный тип COM-объектов, используемый для создания и регистрации COM-объектов. Производители классов реализуют стандартный механизм создания объектов COM-классов. Классы без идентификаторов класса (CLSID) и фабрики классов могут быть созданы посредством вызова конструктора. Использование фабрики классов для создания объектов означает, что для клиентского приложения, которому необходимо создать объект класса, не нужно знать об этом классе ничего, кроме его идентификатора CLSID. Фабрика классов возьмет вызов конструктора на себя, включая передачу аргументов в конструктор и остальные специфичные действия. Класс фабрики классов может быть объединен со многими COM-классами, для каждого из которых могут создаваться объекты. При создании же объекта фабрики классов, в конструктор передается идентификатор CLSID класса, для создания объектов которого предназначается фабрика. Этот идентификатор определяет, объекты какого класса могут быть созданы с помощью данной фабрики классов. Таким образом, каждый экземпляр фабрики классов в системе может быть использован для создания объектов только одного определенного класса.