Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Технология COM

Содержание:

Введение

Технология COM, главный вопрос на который нам предстоит ответить, что же это такое. В чем разница между технологиями COM, Active X и OLE. В данной работе мы ответим на данный вопрос и подробно, в деталях разберем всю технологию. Необходимо начать с определения, что бы последовательно двигаться дальше. COM (Component Object Model) – это объектная модель компонентов. Рассматриваемая технология является основополагающей для Active X и OLE. Технология COM используется при описании API, а также двоичного стандарта, который связывает объекты различных языков и сред программирования. И хочется добавить еще немного о технологии. Она работает с COM – объектами. Данные объекты включают в себя от одного до нескольких интерфейсов. Можно выделить несколько главных плюсов:

  • Создание объектов не зависит от языка программирования, то есть они могут быть написаны на различных языках, без привязки к определенному типу.
  • Объекты могут использоваться абсолютно в любой среде программирования под ОС WIndоws. (Delphi, Visual C++, Visual Basic итд.).

Развитие COM Технологий

После того как, компания Microsoft выпустила ОС Windows, одной из приоритетных задач стало эффективное взаимодействие между различными приложениями внутри ОС. Одними из первых попыток решения данной задачи стали Буфер обмена, разделяемые файлы и DDE (Dynamic Data Exchange). Компания Microsoft не остановилась на достигнутом и позже разработала новую технологию связывания и внедрения объектов (OLE). Но первая версия этой программы была несовершенной и на смену ей пришла вторая версия OLE 2. OLE 2 обладала более расширенным функционалом и позволяла решать вопросы по предоставлению приложениями друг другу собственного функционала. Эта технология развивалась до 1996, после чего была разработана и внедрена технология, которая получила название Active X. Active X, включала в себя автоматизацию, контейнеры, управляющие элементы итд.

Терминология COM

Во второй главе, предлагаю немного посмотреть на термины, которые используются при работе с рассматриваемой технологией.

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

COM - интерфейсы – применяются для объединения нескольких методов COM – объекта. С его помощью клиент правильно обращается к объекту и получать от него правильный ответ. Для того, чтобы узнать список объектов, необходимо использовать встроенный базовый интерфейс lunknown.

Пользователь COM – объекта – обычно им называют само приложение или его часть, которая использует объекты и интерфейсы.

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

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

Технология DCOM – данная технология используется для предоставления прав средствам доступа к объектам, которые находятся на других ПК.

Счетчик ссылок – в счетчике содержатся определенное число процессов, которые в момент работы использует объект, например DLL.

OLE – объекты – данные, которые используются одновременно несколькими приложениями.

Составные документы – в них включены от одного до нескольких OLE – объектов.

Состав COM – приложения – при создании приложения, необходимо учесть следующие составные части:

  • COM – интерфейс
  • COM – сервер
  • COM – клиент

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

В следующих главах мы подробнее рассмотрим, что же означают и как работают некоторые из приведённых терминов.

COM - интерфейсы

COM определяет следующие важные аспекты, которые связаны с интерфейсами:

  • Методы интерфейса абстрактны – он представляет собой набор прототипов, назначение состоит исключительно в определении интерфейса. Работает по принципу определения числа и типов объектов, передаваемых и возвращенных.
  • Интерфейсы подчиняются двоичному стандарту – интерфейс представляется как указатель на virtual table. Где каждая запись представляет из себя ссылку на определенный метод, где уже и содержится реализация интерфейса. Таким образом этот процесс можно представить, как некий процесс получения указателей. Объекты одного класса обычно используют общий virtual table, где для каждого из них создана структура с данными, по которым и определяется вызов корректных функций.
  • Интерфейс включает в себя определенную функциональность – методы интерфейса связаны по смыслу функциональности и назначения. Именование происходит по назначению и перед именем ставится заглавная буква I.
  • Интерфейс имеет уникальный идентификатор – обычно интерфейсы различаются по используемому идентификатору GUID, которые необходимы для ссылок на конкретный интерфейс (Interface Identifier). Абсолютно каждый интерфейс обладает данным идентификатором и при регистрации получает GUID, который связан именно с ним.
  • Интерфейс не может изменится после регистрации в системе – все интерфейсы выполняют определенные задачи, с помощью определения вводимых и выводимых данных. Соответственно изменять интерфейс после размещения в системе не желательно, так как для этого придется делать новый интерфейс.
  • Интерфейсы наследуют функциональность от одного базового предка – все интерфейсы являются, в той или иной степени, потомками IUknown. Он отвечает за базовый функционал интерфейса, в который включен dynamic quering, для опроса субъектов, а также lifetime management, отвечающий за жизненный цикл объекта. В данную функциональность входят три следующих метода:
  • QueryInterface – находится на первом месте в virtual table и с помощью него происходит опрос субъектов и дается доступ на указатели. Так же этот метод используют для обновления COM без потерь на зависимых объектах.
  • AddRef – занимает второе место, счетная функция для того чтобы управлять жизненным циклом. Вызов этого метода может увеличивать значение внутреннего счетчика объекта.
  • Release – находится на третьем месте, по сути такая же счетная функция как и AddRef. С помощью нее можно уменьшить значение внутреннего счетчика объекта.

Свойства COM объектов

COM объект – является CoClass, отвечает за реализацию одного или большего количества интерфейсов. Рассматриваемый объект, представляет из себя набор функций, которые можно использовать через указатель на один из определенных интерфейсов. Можно выделить несколько особенностей COM – объекта:

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

COM – серверы. Локальные и удаленные серверы.

В пятой главе, хотелось бы более подробно остановится на принципе работы рассматриваемой технологии с серверами.

Когда клиент, использующий COM обращается к COM объекту, он не производит поиск этого объекта, он просто делает вызов необходимого интерфейса. Это процесс происходит как раз с использованием COM технологии. Данная технология все необходимые шаги для этого. Шаги могут быть разные, в зависимости от места расположения объекта. Сам объект может располагаться, например, на этом же ПК или на удаленном сервере итд. В зависимости от места расположения используются следующие типы серверов:

  • Внутренний сервер
  • Локальный сервер
  • Удаленный сервер

Внутренний сервер – это по сути просто библиотека DLL, которая располагается на том же ПК, что и клиент. В качестве примера можно привести компонент Active X, расположенный на Веб странице в сети интернет и просматриваемый с помощью встроенного браузера Microsoft. В нашем примере компонент установлен на локальный ПК, там же где и загружается Веб браузер. Наше приложение (клиент) связывается с процессом при помощи вызовов COM – интерфейса, как показано на рисунке ниже.

Более подробное описание схемы взаимодействия клиента с внутренним сервером:

Внутренний СОМ-сервер должен экспортировать четыре функции:
function DllRegisterServer: HResult; stdcall;
function DllUnregisterServer: HResult; stdcall;
function DllGetClassObject (const CLSID, IID: TGUID; var Obj): HResult;
stdcall;
function DllCanUnloadNow: HResult; stdcall;

Все эти функции реализованы в модуле comserv, их необходимо добавить в описание exports проекта. Далее рассмотрим эти функции более подробно:

  • DllRegisterServer - применяется для регистрации DLL СОМ-сервера в системном реестре Windows. При регистрации СОМ-класса в системном реестре создается раздел в HKEY_CZASSES_ROOT\CLSID\{XXXXXXXX-XXXX-XXXX-xxxx-xxxxxxxx}, где число, записанное вместо символов х, представляет собой CLSID данного СОМ-класса. Для внутреннего сервера в данном разделе создается дополнительный подраздел inProcserver32. В этом подразделе указывается путь к DLL внутреннего сервера
  • DllUnregisterServer - применяется для удаления всех разделов, подразделов и параметров, которые были созданы в системном реестре функцией DllRegisterServer при регистрации DLL СОМ-сервера
  • DllGetclassObject - возвращает фабрику класса для конкретного СОМ-класса
  • DllcanUnloadNow - применяется для определения, можно ли в настоящий момент времени выгрузить DLL СОМ-сервера из памяти. Функция проверяет, есть ли указатели на любой СОМ-объект данной DLL, если есть, то возвращает значение S_FALSE, т. е. DLL выгрузить нельзя. Если ни один СОМ-объект данной DLL не используется, то функция возвращает значение SJTRUE

Локальный сервер – это исполняемое приложение с расширением EXE. Приложение запускается в другом процессе, но на одном и том же ПК. В данном случае и клиент, и сервер расположены на одном ПК, хотя возможны случаи, когда они будут находится на разных ПК, в одной сети. В случае если они расположены на одном ПК Локальные серверы используют COM. Если на разных COM начинает использовать внутренний прокси для удаленного вызова. При этом прокси, расположен на одном ПК вместе с клиентом. Существует специальный механизм, позволяющий получать клиентам доступ к объектам, расположенным на другом ПК. Этот процесс называется Маршалинг.

Немного подробнее об этом процессе:

  • принимает указатель интерфейса из процесса сервера и делать указатель прокси в процессе клиента доступным
  • передает аргументы вызовов интерфейса таким образом, как будто они произошли от клиента и размещать аргументы в процесс удаленного объекта

Для любого вызова интерфейса клиент помещает аргументы в стек, вызывает необходимую функцию СОМ-объекта через указатель интерфейса. Если вызов объекта произошел не внутри процесса, вызов проходит через прокси. Прокси упаковывает аргументы в пакет маршалинга и передает получившуюся структуру удаленному объекту. Заглушка (stub) объекта распаковывает пакет маршалинга, выбирает аргументы из стека и вызывает необходимую функцию СОМ-объекта.
Таким образом, маршалинг - это процесс упаковки информации, а демаршалинг - процесс распаковки информации.
Тип маршалинга зависит от объектной принадлежности СОМ. Объекты могут использовать стандартный механизм маршалинга, предоставляемый интерфейсом.

Рисунок 3.5

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

Рисунок 3.6

Фабрики классов

Фабрики классов, еще называемые производителями классов, это особый вид COM – объектов. Главными его функциями являются создание им регистрация этих объектов. Созданы они могут быть при помощи конструктора. При его использовании для создания объектов, нет необходимости знать о нем ничего кроме идентификатора CLSID. Фабрика классов самостоятельно вызывает конструктор и так же самостоятельно передаст аргументы и специфичные действия, необходимые для необходимые для создания объекта. В процессе создания объекта в конструктор передается идентификатор CLSID класса. С помощью него и определяется тип объекта класса. Для того что бы создать объект определенного класса нам необходимо: вызвать функцию CoGetClass (поиск в системном реестре класс с данным CLSID, определяет путь к серверу и предоставляет указатель на интерфейс). Альтернативный путь - это вызов функции CoCreateInstance. С помошью этой функции можно создать один объект класса, действия функции аналогичны предыдущей.

Библиотеки типов

Библиотека типов – это по сути информация, которую передает ActiveX сервер, о объектах и интерфейсах. Если проводить аналогию, то это похоже на заголовочный файл в языке С, в котором находится информация о объектах и данных. Для получения информации из этой библиотеки можно выполнив опрос используемых объектов. Доступ к созданной библиотеке получают с помощью ITypeLib, ItypeInfo и ITypeCom интерфейсов. Через интерфейс ITypeLib запрашиваем информацию, тот в свою очередь, обращается к интерфейсу ItypeInfo. В библиотеке типов может содержаться следующая информация:

  • Функции, не являющиеся методами интерфейса, передающиеся с помощью ActiveX сервера
  • Информация о символьных константах
  • Ссылки на информацию о других типах в других библиотеках

Далее перечислены основные причины для ипользования библиотеки типов:

  • Объекты, которые используют непосредственную привязку к vtable, должны быть описаны в библиотеке типов, т.к. ссылки в vtable формируются во время компиляции
  • Объекты, созданные из классов, которые поддерживают интерфейс IProvideClassInfo, должны иметь библиотеку типов. Объекты, имеющие в своем составе данные интерфейс,  являются типизированными COM-объектами, т.к. предоставляют информацию  об используемых типах (из библиотеки типов)
  • Элементы управления ActiveX должны иметь библиотеку типов, которая содержится непосредственно в DLL или OCX файле, содержащем код ActiveX-сервера
  • Приложения, которые являются Automation-серверами,  должны иметь библиотеку типов, для более удобно связывания с клиентами

Рассмотрев, что такое библиотека типов можно сделать вывод,Ю что ее использование просто необходимо для облегчения работы с приложениями, узнавание типов данных итд.

Диспетчерский интерфейс

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

GetIDsOfNames. Используя данный, метод мы сможем получить таблицу идентификаторов, с информацией о них. IDispatch во время использования это процедуры реализуется автоматически и называется поздним связыванием. Поздним она называется из-за того, что выполняется на этапе выполнения программы. Отдельно хочется выделить метод под названием Invoke – это метод интерфейса dispID. Метод необходим для корректного обращения клиента к ресурсу сервера. Invoke – это универсальный метод так как допускает вызов с любым количеством параметров. Реализация Invoke распаковывает параметры и осуществляет вызов соответствующего метода или свойства и осуществляет контроль над выдачей исключений при выполнении метода или свойства. Когда выполнение метода или обработка свойства заканчивается, возвращаемые значения метода или свойства отправляются обратно клиенту. Если обращение клиента к серверу переходит через границы процесса или машины, то автоматически реализуются все действия по организации маршаллинга. Такая прозрачность является основным достоинством использования интерфейса диспетчеризации. Но также есть и минусы, например ограничение на типы используемых данных при передачи параметров. Возможно использовать исключительно тринадцать стандартных типов данных. При возникновении определенных задач, требующих выйти за эти границы можно написать собственный proxy/stub код. Еще один из недостатков - это невозможность проверки соответствия типов функций на этапе компиляции.

Типы интерфейсов

Выделяют два типа интерфейсов. Пользовательские и Двоичные. Подробнее разберем их.

Пользовательские интерфейсы – определяются самим пользователем и делают возможным вызов интерфейсов используя ссылки из virtual table. В предыдущих главах мы разбирали первые три строчки virtual table, за ними следуют ссылки на остальные используемые интерфейсы.

 В том случае если у сервера есть библиотека типов и реализуется диспетчерский  интерфейс, то получение информации клиентом, становится возможным, без выполнения вызова функций через привязки. Необходимо просто получить идентификаторы dispID диспетчерского интерфейса, и выполнить их привязку к virtual table. Это позволяет осуществлять гораздо более быстрый доступ к ресурсам объекта, осуществляя прямой вызов через ссылки  в virtual table, не используя диспетчерский интерфейс. Код непосредственной привязки к vtable может быть автоматически сгенерирован на этапе компиляции. Разумеется, такой метод вызова функций гораздо быстрее, чем методы привязки идентификаторов (т.к. вызов осуществляется через Invoke, что вызывает процедуры упаковки/распаковки параметров) и позднего связывания (т.к. осуществляется полный цикл работы с диспетчерским интерфейсом)

Следующими следуют Двойные интерфейсы.

Несмотря  на то, что COM предоставляет возможность обращения к ресурсам серверов используя vtable-интерфейсы, что повышает скорость взаимодействия клиента и сервера, некоторые клиенты могут быть разработаны таким образом, что обращаются к объектам только через интерфейс диспетчеризации. Это могут быть, например, интерпретируемые макроязыки, которые включают в себя средства для работы с COM-объектами, и в которых не реализованы возможности для привязки к vtable. Таким образом, COM предлагает то, что называется двойственным, или двойным интерфейсом (dual interface). Двойные интерфейсы предлагают два пути для доступа к ресурсам сервера: через диспетчерский интерфейс и через vtable-интерфейс. Двойной интерфейс определяется как наследник IDispatch. Преимущества использования двойных интерфейсов:

  Двойные интерфейсы предлагают возможность получения указателей на ресурсы сервера по их именам при компиляции объекта, таким образом, позволяя создавать клиентов, с привязкой к vtable на этапе компиляции;
  Двойные интерфейсы позволяют клиентам осуществить прямой доступ к ресурсам сервера через vtable-интерфейсы, что увеличивает скорость взаимодействия объектов;
  Двойные интерфейсы имею преимущества проверки соответствия типов на этапе компиляции (преимущества раннего связывания);
  Клиенты, не работающие напрямую с vtable-интерфейсами имеют возможность взаимодействовать с объектами через диспетчерские интерфейсы;
  Двойные интерфейсы предоставляют возможность маршаллинга для обоих своих частей – для диспетчерского интерфейса и vtable-интерфейса. При обращении к серверу, находящемуся в другом адресном пространстве осуществляется автомаршаллинг при обращении через любую часть интерфейса.

Существует  набор ограничений по использованию  двойных интерфейсов. Они в основном связаны с типами данных, т.к. двойной  интерфейс является наследником интерфейса IDispatch. Однако, существует путь для частичного избежания таких ограничений, определяя не двойной интерфейс, а два отдельных, один из которых – диспетчерский, другой - пользовательский (без ограничений на тип данных). Таким образом, можно осуществить доступ к ресурсам сервера как через диспетчерский, так и через vtabl-интерфейс. 

Расширения COM

Одним из расширением  технологии COM является OLE, представляющая собой библиотеку собственных интерфейсов, типов данных и подпрограмм, предназначенных для обеспечения функциональности OLE. Каждая функция именуется с префиксом IOle.
           Еще одним расширением COM является не так давно созданная  технология ActiveX. Основные ответвления ActiveX носят названия ActiveX Documents (документы ActiveX) и элементы управления ActiveX (ActiveX controls). ActiveX «моложе» OLE, и была разработана как COM-расширение, оптимизированное по скорости и по размеру. Однако, OLE с появлением ActiveX уже была неплохо развита, и сейчас различия между этими двумя технологиями начинают уменьшаться, а их функциональности все больше перекрываться.

OLE/Active document
Документы OLE (OLE/Active documents) – один из набора сервисов, которые предлагает технология OLE. Объекты OLE documents имеют все свойства OLE по связи и внедрению данных, визуального редактирования, поддержки drag-and-drop, активизации по месту (in-place-activation). Используя OLE document можно определить любой количество интерфейсов, через которые обеспечивается стандартное поведения объекта, такое как визуальное редактирования и drag-and-drop. Посредством реализации этих интерфейсов, объекты OLE documents могут быть свободно объединены в единую систему взаимодействующих объектов с разными форматами данных, таких, как звуковые фрагменты, текстовые документы и растровые изображения. Объект OLE documents может быть реализован как внутренний и внешний COM-сервер. Такой объект состоит из двух частей: визуальной (presentation data), предназначенной для отображения визуальной части объекта и из внутренней части (native data), используемой для редактирования объекта. Объекты OLE documents могут быть контейнерами документов (document container) и серверами документов (document server). Сервер документов обеспечивает функциональность объектов OLE documents. В среде контейнера документов может быть активизирован любой сервер документов.

Automation
Технология автоматизации (automation) предлагает возможность программного управления одного приложения другим. В данной технологии различаются  две составные компоненты:

Клиентская часть, называемая контроллером автоматизации (automation controller);
Серверная часть, которая носит название объекта автоматизации (automation object) – объект, которым управляет клиент. Объекты автоматизации могут быть реализованы как внутренние, внешние и удаленные сервера. Технология автоматизации характеризуется двумя положениями:
Объекты автоматизации должны иметь возможность определить множество свойств и команд через описания типов, т.е. они должны получить информацию об интерфейсах объекта, с которым идет взаимодействие, о методах интерфейсов и о типах аргументов. Такая информация предоставляется через библиотеки типов. Однако, использование библиотеки типов необязательно при использовании интерфейса диспетчеризации, т.к. с помощью последнего осуществляется привязка интерфейсов на этапе выполнения программы (недостатком такого подхода является отсутствие проверки соответствия типов на этапе компиляции)

ActiveX control

Данная технолгия дполняет COM и OLE дополнительным функционалом. Сам по себе ActiveX control – это визуализация элементов управления, которые реализуются как внутренние COM – сервера, с включенными в них OLE – контейнерами. ActiveX не является приложением, а является лишь объектами, которые позвролют решать какие-нибудь частные задачи. Из особенностей присущих ActiveX control можно отметить обработку событий, поддержка лицензирования и привязка к определенным источникам данных. Чаще всего использования Active X можно увидеть в разработке приложений и используют его как визуализацию объектов.

Межпроцессорные визуальные объекты.

Обычно документы OLE и элементы ActiveX используются всеми приложениями, так как они находятся в общем доступе. Когда мы говорим о межпроцессорных объектах, здесь общий доступ для них ограничен. Создавать данные объекты гораздо труднее. Для создания таких объектов необходимо сначала создать пользовательский интерфейс объекта, которыми можно управлять, используя маршаллинг интерфейсов. Так же у нас есть возможность использовать автомаршаллинг, с помощью двойного интерфейса IDispatch или написать собственный класс, который будет использовать маршаллинг.

Средства разработки COM – приложений

Так как рассматриваемая нами технология была создана компанией Microsoft, самыми удобными и простыми способами разработки являются из собственные продукты. Хотелось бы в качестве примера рассмотреть продукцию компании Inrise inc. Компания создает продукты, позволяющие заниматься быстрой разработкой приложений, отнеси же их можно к классу приложений Rapid Application Development. Как пример приложения Borland C++ Builder и Borland Delphi. По функционалу обе программы идентичны. Включают в себя готовые компоненты разработки, как раз за счет них и можно заниматься быстрой разработкой. Различные формы, которые мы можем создать благодаря этим продуктам без лишних трудностей портируются в COM – класс, без потери свойств свойств и методов. Так же благодаря этим продуктам процесс разработки становится простым и прозрачным и не требует особых навыков в виде знания языка описания интерфейсов или языка описания объектов.

Заключение

В моей работе я подробно рассмотрел технологию COM, начиная от истоков ее создания и заканчивая принципами работы. Раскрыл основные термины, используемые при работе с данной технологией. И самое главное процесс работы технологии на ПК и ее взаимодействие с приложениями на ПК и серверами. Можно сделать вывод, что у технологии COM есть, существенные плюсы, такие как универсальность разработки, а с помощью различных программных продуктов, облегчение этой разработки. Но не лишена она и минусов, таких как сложность архитектуры или применение только на платформе Microsoft. В любом случае, данная технология является одной из самых распространенных и простых для разработчиков.

Список литературы

  1. Роберт Дж. Оберг «COM+. Технология, основы и программирование», Год издания: 2000
  2. Дональд Бокс «Сущность технологии COM», Год издания: 2001
  3. Михаил Безверхов Статьи на тему «что такое технология COM»
  4. www.developing.com
  5. Анатолий Тенцер «Создание приложений с применением технологии COM+»