Файл: Технология COM (АНАЛИЗ ТЕХНОЛОГИИ COM).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 23.04.2023

Просмотров: 247

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

COM (Component Object Model) - это метод разработки программных компонентов, небольших двоичных исполняемых файлов, которые предоставляют необходимые сервисы приложениям, операционным системам и другим компонентам. Другими словами, COM определяет стандартный механизм, с помощью которого одна часть программного обеспечения предоставляет свои сервисы другой независимо от способа их реализации.

COM - это не язык программирования, а подход (спецификация) к созданию программ, обеспечивающий взаимодействие программ любых типов. Компоненты COM объединяются друг с другом для создания приложений или систем компонентов. Компоненты можно менять во время выполнения, без перекомпиляции или перекомпоновки приложения. COM - это основа, на которой построены такие технологии Microsoft, как ActiveX, DirectX и OLE.

Цель курсовой работы – рассмотреть технология COM.

Задачи курсовой работы:

- дать понятие технологии;

- сравнить технологию с другими технологиями;

-

1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ТЕХНОЛОГИИ COM

1.1 Понятие технологии COM

Component Object Model ( COM) - компонентно-ориентированная ар­хитектура, которая позволяет создавать приложения и программные системы, пост­роенные из совокупности компонентов, разработанных различными производителями и на разных платформах. COM является основой, на которой строятся более высо­коуровневые приложения и сервисы. Среди них сервисы OLE, охватывающие различ­ные аспекты компонентных систем, включающие в себя сложные документы, элементы управления, передачу данных между приложениями и многое другое. Несмотря на по­пуляризацию в последнее время платформы .NET, при разработке современных при­ложений широко используются компоненты COM, созданные на базе языков програм­мирования, типа Visual Basic и Visual C++. Модель COM относится к широко приме­няемым средствам модульного программирования. Созданные на ее основе программы предоставляют большой набор интегрированных служб, легкодоступных инструментов и полезных приложений. Реализация компонент COM не зависит от языка програм­мирования, средства COM имеют бинарно-совместимую архитектуру компонентов. В п. 2-4 статьи будут рассмотрены примеры построения компонент COM на языке про­граммирования Visual C+—+, описаны варианты и особенности создания COM-объектов и применения их на практике, приведены анализ технологии COM и сравнение ее с дру­гими схожими технологиями, представлены некоторые примеры использования, особен­но COM-объектов для работы с видеокамерами и видеозахватом.


Технология COM.

Обзор. Давно изучены и разработаны способы переиспользования кода, опи­сывающего некоторую функциональность в рамках одного языка программирования, одной платформы, одного компилятора. Применение модуля, скомпилированного из ис­ходного кода, написанного на одном языке, в программном коде на другом языке бы­ло затруднено. Для решения данной задачи компания Microsoft предложила техноло­гию COM - компонентную объектную модель [1]. Компонент - это независимая часть программного обеспечения, предназначенная для выполнения какой-то определенной работы. Функциональность компонента может быть использована в любой програм­ме. Нет необходимости дублировать код по разным программам, в которых требуется применять одну и ту же функциональность. В то же время компонент можно заменить, отредактировать, исправить. Модель COM представляет собой набор шаблонов и реко­мендацию для создания бинарно-совместимых компонентов программного обеспечения, позволяющая строить компоненты, которые могут обмениваться информацией незави­симо от языка программирования или инструментальных средств, выбранных для их построения.

    1. Основные понятия. Программный код компонента (Component code) опи­сывает работу, которую выполняет компонент. Например, если компонент предназначен для вычисления квадратного корня, то описывающий ее код будет называться про­граммным кодом компонента.

Интерфейс (Interface) позволяет программе обращаться к функциональным воз­можностям компонента. Он описывает те функции, которые могут быть вызваны про­граммой.

GUID ( Globally Unique Identifier) означает глобально-уникальные идентификаторы, которые назначаются каждому компоненту COM и вновь созданному интерфейсу. Они однозначно идентифицируют компонент в операционной системе. Когда компонент или интерфейс меняется, для них необходимо создавать новые идентификаторы. Иденти­фикатор является 128-битовым целым значением.

Бинарная совместимость (Binary compatible) позволяет компонентам COM соот­ветствовать требованиям, предъявляемым к стандартному бинарному коду (binary standard). Это означает, что независимо от языка, используемого для создания соб­ственного компонента COM, он будет совместим и пригоден для применения любыми другими компонентами COM. Платформа .NET является продолжателем данной тех­нологии.

    1. Версии компонента COM. Как было сказано ранее, каждый компонент COM получает уникальное значение - идентификатор GUID. Эти идентификаторы хранятся в системном реестре Windows. После создания компоненты COM и введения ее в эксплуатацию возникает вопрос, как же изменить интерфейс или код компоненты, если ее уже какая-то программа использует? Имеется простое решение - при каждом изменении компоненты она получает новый идентификатор. Это дает гарантию того, что если какая-то программа уже применяет имеющий на данный момент интерфейс, то она будет использовать именно его и далее. Однажды созданный интерфейс никогда не исчезает, а продолжает существовать. При модификации интерфейса в него мож­но добавлять новые функциональные возможности, но нельзя удалять старые. Отсюда возникает сложность - непомерное разрастание компонента со временем. Единствен­ным решением такой проблемы может стать изначально правильное проектирование интерфейса с тем, чтобы далее он оставался по возможности неизменным [1].

1.2 Интерфейсы СOM

Интерфейсы COM. Интерфейс COM позволяет приложениям и различным компонентам обращаться к функциям данного компонента COM. К функциям компо­нента можно обращаться с помощью таблицы виртуальных функций ( virtual function table), которая также называется vtable (виртуальная таблица) или VTBL [1]. Эта таб­лица содержит не реально существующие функции, а список указателей на функции. Компонент, которому необходимо получить доступ к функции другого компонента, об­ращается к VTBL. Клиенты не могут обращаться к таблице напрямую. Для этого при­меняется другой указатель, называемый указателем интерфейса (interface pointer), добавляющий промежуточный уровень доступа, который делает возможной реализа­цию данного интерфейса. Такая техника очень похожа на реализацию динамическо­го полиморфизма языка C+—+, где любой динамически полиморфный класс содержит указатель на таблицу виртуальных функций. Интерфейс не является классом – нельзя создать экземпляр интерфейса, так же как и экземпляр класса с чисто виртуальными функциями в языке C+—+. При создании компонента COM обязательно нужно реали­зовать интерфейс IUnknown. Если компонент должен быть доступен средствами языка сценариев, то нужно также реализовать интерфейс IDispatch или пользовательский интерфейс, который и будет нести основную функциональность компонента.

Таблица 1 - Предопределенные константы типа HRESULT

Константа

Описание

S_OK

Успешное завершение операции

S_FALSE

Успешное завершение операции. Отличается от S ОК тем, что подразу­мевает какую-то особенность при выполнении функции. Использование S FALSE не регламентируется строго, в каких случаях будет исполь­зовано значение S ОК, а в каких — S FALSE, зависит от конкретного сервера. Например, если функция должна вернуть список каких-либо объектов, она может вернуть S ОК, если список не пуст, и S FALSE, если ошибок не было, но список пустой

Е FAIL

Ошибка без указания причины

E_UNEXPECTED

«Катастрофическая» ошибка — непредвиденная ситуация, из-за которой операция не может быть выполнена

E_NOTIMPL

Функция не реализована. Если по какой-то причине разработчик сервера не считает нужным реализовывать какие-либо функции интерфейса, он пишет их так, чтобы они в любом случае возвращали это значение

E OUTOFMEMORY

Нехватка памяти

E INVALIDARG

Неверный аргумент функции

E NOINTERFACE

Запрошен интерфейс, отсутствующий в сервере

E POINTER

Неверный указатель

E HANDLE

Неверный дескриптор

E ABORT

Операция прервана

E ACCESSDENIED

В доступе отказано


Интерфейс IUnknown наиболее важен по сравнению с остальными интерфейсами. Его должен реализовывать каждый компонент COM. Интерфейс IUnknown содер­жит три метода: QueryInterface, AddRef и Release. Метод QueryInterface применяется для выявления доступных интерфейсов компонента. В начале использования интер­фейса необходимо вызывать метод AddRef, при его завершении должен вызываться метод Release. Интерфейс IDispatch содержит функции, которые позволяют обращать­ся к методам и свойствам объектов COM. Он позволяет Visual Basic и другим языкам создания сценариев управлять свойствами и методами объекта.

Все методы интерфейса должны возвращать значение типа HRESULT за исключе­нием методов интерфейса IUnknown AddRef и Release, которые возвращают количество существующих ссылок на объект.

Тип HRESULT является одним из средств контроля ошибок в COM/DCOM. Он представляет собой 32-битное число, в котором кодируется результат операции. Старший бит этого числа равен 1, если была ошибка, и 0, если все прошло нормаль­но. Следующие 4 бита зарезервированы для дальнейшего использования. Следующие 11 бит показывают, где возникла ошибка (это значение обычно называется facility code, что можно приблизительно перевести как код устройства, если подразумевать здесь не только аппаратные, но и логические устройства). Младшие 16 бит кодируют соб­ственно ошибку.

Существуют предопределенные константы типа HRESULT, часть которых показана в таблице. Константы могут быть разными на различных платформах, поэтому в целях совместимости лучше пользоваться их символьными именами, а не значениями.

    1. Контракт интерфейса. Каждый интерфейс предоставляет контракт ин­терфейса, описывающий интерфейс. Контракт интерфейса COM содержит следующие элементы:
  • идентификатор интерфейса;
  • сигнатура интерфейса (Interface signature);
  • семантика интерфейса.

Каждый интерфейс имеет идентификатор GUID, который служит его программным именем. Он является кодом ID, уникально идентифицирующим контракт, определен­ный интерфейсом. После того, как интерфейс, сконструированный с ID, компилируется в бинарный вид и вводится в действие, свойства, заданные в элементах интерфейса, из­менять нельзя.

Сигнатура интерфейса (interface signature), называемая также синтаксисом ин­терфейса (interface syntax), определяет такие показатели:

  • число и порядок методов в интерфейсе;
  • число, порядок и тип всех параметров каждого метода;
  • тип возвращаемого значения каждого метода.

Тип параметра указывает, является ли параметр входным (in), выходным (out) или же входным/выходным (in/out). Сигнатура интерфейса содержит определение типов, используемых в интерфейсе, и соглашения о вызовах функций (cdecl, Pascal, stdcall) [2].


Семантика интерфейса - это описание поведения каждого метода, контекста и по­рядка, в котором интерфейс должен или может быть вызван, коды ошибок, специфи­ческие для данного метода, и возможные коды успешного завершения.

    1. Выделение и освобождение памяти. Существуют три типа параметров, передаваемых в функции-элементы COM объекта:
  • параметры In, память для которых выделяет и освобождает вызывающая про­грамма;
  • параметры Out, выделяющиеся и освобождающиеся вызывающей программой с помощью стандартного средства выделения памяти COM;
  • параметры In-Out, которые первоначально выделяются вызывающей програм­мой, затем освобождаются и при необходимости повторно выделяются вызы­вающей программой. За конечное освобождение памяти ответственность несет вызывающая программа.
    1. Типы COM. Компоненты COM могут быть представлены в виде клиентов, серверов и элементов ActiveX.

Клиенты COM могут являться приложениями, которые управляют одним или несколькими объектами COM. Они могут использовать уже имеющиеся объекты, соз­давать новые, менять параметры объектов, вызывать методы.

Серверы COM - это объекты COM, которые могут существовать в том же процессе, что и их контроллер. Также их можно переместить в другой процесс. Объекты внутри­процессного сервера (in-of-process server) реализуются как модули DLL и исполняются внутри пространства процесса контроллера. Объекты внепроцессного сервера (out-of­process server) реализуются в виде исполняемых файлов и исполняются в отдельном пространстве процесса [1].

Элементы ActiveX реализуются в виде внутрипроцессного сервера, который можно использовать в любом контейнере OLE. Они отличаются от внутрипроцессного сервера COM тем, что ActiveX элементы имеют пользовательский интерфейс

1.3 Порядок построения компонента

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

    1. Файл IDL. Пользовательские интерфейсы находятся с помощью языка опре­деления интерфейсов MIDL (Microsoft Interface Definition Language). Это декларатив­ный язык (declarative language), основанный на языке IDL фонда открытого программ­ного обеспечения [6]. Язык MIDL предоставляет средства для определения интерфей­сов языково-независимым способом. Он используется для генерации программного ко­да процедур RPC (Remote Procedure Call), управляющих взаимодействием с сервером COM при реализации заданного интерфейса. Синтаксис языка IDL похож на синтаксис языка C++.