Файл: Предпосылки возникновения технологии COM и область её использования.pdf
Добавлен: 27.06.2023
Просмотров: 85
Скачиваний: 3
СОДЕРЖАНИЕ
1. Предпосылки возникновения технологии COM и область её использования
1.1. История возникновения технологии COM
1.2. Применение технологии COM
2.1. Основные понятия технологии COM
2.2. Основные свойства, отличающие COM от ООП. Концепции технологии COM
2.4. Выделение и освобождение памяти
2.6. Портативность и коммуникабельность COM. Регистрация COM-серверов.
3.1. Сравнение COM со смежными технологиями
GUID (Globally Unique Identifier) означает глобально-уникальные идентификаторы, которые назначаются каждому компоненту COM и вновь созданному интерфейсу. Они однозначно идентифицируют компонент в операционной системе. Когда компонент или интерфейс меняется, для них необходимо создавать новые идентификаторы. Идентификатор является 128-битовым целым значением.
Бинарная совместимость (Binary compatible) позволяет компонентам COM соответствовать требованиям, предъявляемым к стандартному бинарному коду(binary standard). Это означает, что независимо от языка, используемого для создания собственного компонента COM, он будет совместим и пригоден для применения любыми другими компонентами COM. Платформа .NET является продолжателем данной технологии.
Как было сказано ранее, каждый компонент COM получает уникальное значение – идентификатор GUID. Эти идентификаторы хранятся в системном реестре Windows. После создания компоненты COM и введения ее в эксплуатацию возникает вопрос, как же изменить интерфейс или код компоненты, если ее уже какая-то программа использует? Имеется простое решение – при каждом изменении компоненты она получает новый идентификатор. Это дает гарантию того, что если какая-то программа уже применяет имеющий на данный момент интерфейс, то она будет использовать именно его и далее. Однажды созданный интерфейс никогда не исчезает, а продолжает существовать. При модификации интерфейса в него можно добавлять новые функциональные возможности, но нельзя удалять старые. Отсюда возникает сложность – непомерное разрастание компонента со временем. Единственным решением такой проблемы может стать изначально правильное проектирование интерфейса с тем, чтобы далее он оставался по возможности неизменным [10, с.40].
2.2. Основные свойства, отличающие COM от ООП. Концепции технологии COM
Технология объектно-ориентированного программирования основа-на на том, что приложение разбивается на объекты, которые взаимодей-ствуют друг с другом внутри программы (рис. 2.1).
Рисунок 2.1 - Программа, сконструированная в ООП [2, с.5]
Это дает возможность быстрой разработки и модификации программных продуктов с избежанием ошибок, так как программный код разбивается на отдельные блоки (объекты), связь между которыми осу-ществляется по установленным правилам (свойства и методы).
В COM-технологии объекты помещаются в отдельные исполняемые блоки (рис. 2.2), которыми могут являться динамически компонуемые библиотеки (DLL) или приложение (EXE).
Рисунок 2.2 - Программа, сконструированная по архитектуре COM [2, с.6]
Модель COM представляет собой инструкцию по созданию совместимых компонентов программного обеспечения и не является языком программирования, библиотекой программного кода или компилятором.
Технология COM основана на следующих основных концепциях.
1. Уникальность и контекстная независимость компонент. В системе не должно быть компонентов с одинаковым способом обращения и разными смысловыми назначениями.
2. Инкапсуляция. Реализация компонентов COM должна быть скрыта. Это необходимо для того, чтобы была независимость от языков программирования.
3. Портативность и коммуникабельность. Нужный компонент можно быстро найти динамически, где бы он ни находился.
Преимущество СОМ заключается в том, что это позволяет каждому разработчику сконцентрироваться на разработке своих компонент, которые могут обмениваться информацией независимо от языка программирования или инструментальных средств реализации. Более того, технология COM дает гибкие возможности динамической настройки и модификации программного продукта с учетом желаний пользователя и особенностей операционной системы [2, с.6].
2.3. Интерфейсы COM
Интерфейс COM позволяет приложениям и различным компонентам обращаться к функциям данного компонента COM. К функциям компонента можно обращаться с помощью таблицы виртуальных функций (virtual function table), которая также называется vtable (виртуальная таблица) или VTBL [9, с.52]. Эта таблица содержит не реально существующие функции, а список указателей на функции. Компонент, которомунеобходимо получить доступ к функции другого компонента, обращается к VTBL. Клиенты не могут обращаться к таблице напрямую. Для этого применяется другой указатель, называемый указателем интерфейса (interface pointer), добавляющий промежуточный уровень доступа, который делает возможной реализацию данного интерфейса. Такая техника очень похожа на реализацию динамического полиморфизма языка C++, где любой динамически полиморфный класс содержит указатель на таблицу виртуальных функций. Интерфейс не является классом – нельзя создать экземпляр интерфейса, так же как и экземпляр класса с чисто виртуальными функциями в языке C++. При создании компонента COM обязательно нужно реализовать интерфейс IUnknown. Если компонент должен быть доступен средствами языка сценариев, то нужно также реализовать интерфейс IDispatch или пользовательский интерфейс, который и будет нести основную функциональность компонента.
Интерфейс IUnknown наиболее важен по сравнению с остальными интерфейсами. Его должен реализовывать каждый компонент COM. Интерфейс IUnknown содержит три метода: QueryInterface, AddRef и Release. Метод QueryInterface применяется для выявления доступных интерфейсов компонента. В начале использования интерфейса необходимо вызывать метод AddRef, при его завершении должен вызываться метод Release. Интерфейс IDispatch содержит функции, которые позволяют обращаться к методам и свойствам объектов COM. Он позволяет Visual Basic и другим языкам создания сценариев управлять свойствами и методами объекта.
Таблица 2.1 - Предопределенные константы типа HRESULT [10, с.54]
Константа |
Описание |
S_OK |
Успешное завершение операции |
S_FALSE |
Успешное завершение операции. Отличается от S_OK тем, что подразумевает какую-то особенность при выполнении функции. Использование S_FALSE не регламентируется строго, в каких случаях будет использовано значение S_OK, а в каких – S_FALSE, зависит от конкретного сервера. Например, если функция должна вернуть список каких-либо объектов, она может вернуть S_OK, если список не пуст, и S_FALSE, если ошибок не было, но список пустой |
E_FAIL |
Ошибка без указания причины |
E_UNEXPECTED |
«Катастрофическая» ошибка – непредвиденная ситуация, из-за которой операция не может быть выполнена |
E_NOTIMPL |
Функция не реализована. Если по какой-то причине разработчик сервера не считает нужным реализовывать какие-либо функции интерфейса, он пишет их так, чтобы они в любом случае возвращали это значение |
E_OUTOFMEMORY |
Нехватка памяти |
E_INVALIDARG |
Неверный аргумент функции |
E_NOINTERFACE |
Запрошен интерфейс, отсутствующий в сервере |
E_POINTER |
Неверный указатель |
E_HANDLE |
Неверный дескриптор |
E_ABORT |
Операция прервана |
E_ACCESSDENIED |
В доступе отказано |
Все методы интерфейса должны возвращать значение типа HRESULT за исключением методов интерфейса IUnknown AddRef и Release, которые возвращают количество существующих ссылок на объект.
Тип HRESULT является одним из средств контроля ошибок в COM/DCOM. Он представляет собой 32-битное число, в котором кодируется результат операции. Старший бит этого числа равен 1, если была ошибка, и 0, если все прошло нормально. Следующие 4 бита зарезервированы для дальнейшего использования. Следующие 11 бит показывают, где возникла ошибка (это значение обычно называется facility code, что можно приблизительно перевести как код устройства, если подразумевать здесь не только аппаратные, но и логические устройства). Младшие 16 бит кодируют собственно ошибку.
Существуют предопределенные константы типа HRESULT, часть которых показана в таблице. Константы могут быть разными на различных платформах, поэтому в целях совместимости лучше пользоваться их символьными именами, а не значениями.
Каждый интерфейс предоставляет контракт интерфейса, описывающий интерфейс. Контракт интерфейса COM содержит следующие элементы:
- идентификатор интерфейса;
- сигнатура интерфейса (Interface signature);
- семантика интерфейса. Каждый интерфейс имеет идентификатор GUID, который служит его программным именем. Он является кодом ID, уникально идентифицирующим контракт, определенный интерфейсом. После того, как интерфейс, сконструированный с ID, компилируется в бинарный вид и вводится в действие, свойства, заданные в элементах интерфейса, изменять нельзя.
Сигнатура интерфейса (interface signature), называемая также синтаксисом интерфейса (interface syntax), определяет такие показатели:
- число и порядок методов в интерфейсе;
- число, порядок и тип всех параметров каждого метода;
- тип возвращаемого значения каждого метода. Тип параметра указывает, является ли параметр входным (in), выходным (out) или же входным/выходным (in/out). Сигнатура интерфейса содержит определение типов, используемых в интерфейсе, и соглашения о вызовах функций (cdecl, Pascal, _stdcall).
Семантика интерфейса – это описание поведения каждого метода, контекста и порядка, в котором интерфейс должен или может быть вызван, коды ошибок, специфические для данного метода, и возможные коды успешного завершения [3, с.119].
2.4. Выделение и освобождение памяти
Существуют три типа параметров, передаваемых в функции-элементы COM объекта:
- параметры In, память для которых выделяет и освобождает вызывающая программа;
- параметры Out, выделяющиеся и освобождающиеся вызывающей программой с помощью стандартного средства выделения памяти COM;
- параметры In-Out, которые первоначально выделяются вызывающей программой, затем освобождаются и при необходимости повторно выделяются вызывающей программой. За конечное освобождение памяти ответственность несет вызывающая программа [3, с.121].
2.5. Типы COM
Компоненты COM могут быть представлены в виде клиентов, серверов и элементов ActiveX.
Клиенты COM могут являться приложениями, которые управляют одним или несколькими объектами COM. Они могут использовать уже имеющиеся объекты, создавать новые, менять параметры объектов, вызывать методы.
Серверы COM – это объекты COM, которые могут существовать в том же процессе, что и их контроллер. Также их можно переместить в другой процесс. Объекты внутри-процессного сервера (in-of-process server) реализуются как модули DLL и исполняются внутри пространства процесса контроллера. Объекты внепроцессного сервера (out-of-process server) реализуются в виде исполняемых файлов и исполняются в отдельном пространстве процесса.
Элементы ActiveX реализуются в виде внутрипроцессного сервера, который можно использовать в любом контейнере OLE. Они отличаются от внутрипроцессного сервера COM тем, что ActiveX элементы имеют пользовательский интерфейс [3, с.122].
2.6. Портативность и коммуникабельность COM. Регистрация COM-серверов.
Ещё одно главное правило COM-технологии - отсутствие контекстной зависимости клиента и сервера. Под контекстной независимостью подразумевается, что клиент должен получить связь с сервером, где бы он ни находился.
Связь клиента с сервером берёт на себя операционная система, которая содержит системную базу данных, называемую системным реестром, где прописывается название COM-сервера, уникальный номер компонента CLSID и другая информация.
Реестр имеет иерархическую структуру в виде дерева, где узлами являются разделы, а листьями - данные.
Для просмотра и редактиования реестра можно использовать стандартную программу regedit.exe редактор реестра (рис. 2.3).
Рисунок 2.3 - Редактор реестра [2, с.12]
Данные об объектах COM хранятся в подразделе CLSID раздела HKEY_CLASSES_ROOT. В этом разделе перечислены CLSID всех компонентов, установленных в системе. Каждый CLSID содержит параметр по умолчанию, называемый «дружественным» именем компонента. В разделе описания компонента есть подраздел LocalServer32 (для внешних COM-серверов) или InprocServer32 (для внутренних COM-серверов), содержащих имя приложения или DLL, в которых находится компонент.
Имя файла и CLSID - это наиболее важные данные для нормального функционирования, но для некоторых, более сложных компонентов COM, хранится и другая информация. Например, это номер библиотеки типов, поддерживаемой данным COM-сервером (TypeLib), номер версии COM-сервера (Version), программное имя (ProgID) и т. п.