Добавлен: 03.07.2023
Просмотров: 56
Скачиваний: 3
Введение
Технология 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 определяет следующие важные аспекты, которые связаны с интерфейсами:
- Методы интерфейса абстрактны – он представляет собой набор прототипов, назначение состоит исключительно в определении интерфейса. Работает по принципу определения числа и типов объектов, передаваемых и возвращенных.
- Интерфейсы подчиняются двоичному стандарту – интерфейс представляется как указатель на virtual table. Где каждая запись представляет из себя ссылку на определенный метод, где уже и содержится реализация интерфейса. Таким образом этот процесс можно представить, как некий процесс получения указателей. Объекты одного класса обычно используют общий virtual table, где для каждого из них создана структура с данными, по которым и определяется вызов корректных функций.
- Интерфейс включает в себя определенную функциональность – методы интерфейса связаны по смыслу функциональности и назначения. Именование происходит по назначению и перед именем ставится заглавная буква I.
- Интерфейс имеет уникальный идентификатор – обычно интерфейсы различаются по используемому идентификатору GUID, которые необходимы для ссылок на конкретный интерфейс (Interface Identifier). Абсолютно каждый интерфейс обладает данным идентификатором и при регистрации получает GUID, который связан именно с ним.
- Интерфейс не может изменится после регистрации в системе – все интерфейсы выполняют определенные задачи, с помощью определения вводимых и выводимых данных. Соответственно изменять интерфейс после размещения в системе не желательно, так как для этого придется делать новый интерфейс.
- Интерфейсы наследуют функциональность от одного базового предка – все интерфейсы являются, в той или иной степени, потомками IUknown. Он отвечает за базовый функционал интерфейса, в который включен dynamic quering, для опроса субъектов, а также lifetime management, отвечающий за жизненный цикл объекта. В данную функциональность входят три следующих метода:
- QueryInterface – находится на первом месте в virtual table и с помощью него происходит опрос субъектов и дается доступ на указатели. Так же этот метод используют для обновления COM без потерь на зависимых объектах.
- AddRef – занимает второе место, счетная функция для того чтобы управлять жизненным циклом. Вызов этого метода может увеличивать значение внутреннего счетчика объекта.
- Release – находится на третьем месте, по сути такая же счетная функция как и AddRef. С помощью нее можно уменьшить значение внутреннего счетчика объекта.
Основной СОМ-интерфейс IUnknown
Интерфейс lunknown обеспечивает механизм учета ссылок (счетчик ссылок на СОМ-объект). При передаче указателя на интерфейс выполняется метод интерфейса lunknown AddRef. По завершении работы с интерфейсом приложение-клиент вызывает метод Release, который уменьшает счетчик ссылок.
При вызове метода Querylnterface интерфейса Iunknown в метод передается параметр IID, имеющий тип TGUID, т. е. идентификатор интерфейса. Параметр метода out возвращает либо ссылку на запрашиваемый интерфейс, либо значение NH. Результатом вызова метода может быть одно из значений, перечисленных в таблице:
Значение |
Описание |
||
S_OK |
Интерфейс поддерживается |
||
E_NOINTERFACE |
Интерфейс не поддерживается |
||
E_UNEXPECTED |
Неизвестная ошибка |
||
Указатели СОМ-интерфейса
Указатель интерфейса - это 32-битный указатель на экземпляр объекта, который является, в свою очередь, указателем на реализацию каждого метода интерфейса. Реализация методов доступна через массив указателей на эти методы, который называется vtable. Использование массива vtable похоже на механизм поддержки виртуальных функций в Object Pascal.
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 начинает использовать внутренний прокси для удаленного вызова. При этом прокси, расположен на одном ПК вместе с клиентом. Существует специальный механизм, позволяющий получать клиентам доступ к объектам, расположенным на другом ПК. Этот процесс называется Маршалинг.