Добавлен: 22.04.2023
Просмотров: 89
Скачиваний: 1
Итак, любая программа, которая предоставляет свои возможности другим приложениям (поддерживает автоматизацию), может делать это через интерфейс ІDіspatch. Интерфейс ІDіspatch происходит от базового интерфейса модели СОМ ІUnknown, тем не менее, в отличие от других COM-интерфейсов, ІDіspatch содержит метод Іnvoke. Его можно использовать для действительного выполнения методов, которые поддерживает COM-объект. Клиент может выполнить любой метод COM-объекта, вызвав метод Іnvoke() интерфейса ІDіspatch. Этот механизм работает при помощи диспинтерфейса (интерфейса диспетчеризации). Диспинтерфейс определяет методы, которые будут доступны благодаря использованию метода Іnvoke() интерфейса ІDіspatch.
Интерфейсы IDispatch можно применять в любой из наиболее распространенных сегодня сред программирования (Visual C++ Studio, Borland Delphi, Borland C++Builder, Visual Basic). Именно этим КОМПАС-Мастер выгодно отличается от КОМПАС-Макро: вам не придется изучать малознакомый язык программирования, вы можете создавать свои приложения в той среде, к которой привыкли.
Свойства COM-объектов
Все известные нам на данный момент СОМ-объекты обычно содержатся в файлах с расширением DLL или OCX. Один из таких файлов может содержать как одиночный СОМ-объект, так и несколько СОМ-объектов. Ключевым механизмом в работе технологии СОМ, мы можем выделить возможность предоставления связи и взаимодействия между компонентами и приложениями, а также реализация клиент-серверных взаимодействий при помощи интерфейсов.
В данном разделе, как вы уже могли заметить, мы поговорим с вами, о таком важном моменте, как о Com- объектах. В самом начале нашей исследовательской работы мы рассматривали начальные стадии и ключевые моменты, на которых базируется вся работа данной программы. А сейчас мы более детально рассмотрим, что же представляют собой com- объекты, какие у них свойства, в чем заключается их суть и как же они работают?
Технология СОМ реализуется с помощью СОМ-библиотек (в число которых, мы можем отнести такие файлы операционной системы, как OLE32.DLL и OLE-Aut32.DLL). Что же такое COM- библиотека? СОМ-библиотека представляет собой некий набор стандартных интерфейсов, которые, в свою очередь, обеспечивают функциональность СОМ-объекта, а также небольшой набор функций API, отвечающих за создание и управление СОМ-объектов.
Описание реализации работы DAX расположена в модуле Axctris. СОМ-объект образует собой двоичный код, который выполняет какую-либо функцию и имеет один или несколько интерфейсов.
СОМ-объект содержит методы, которые позволяют приложению пользоваться СОМ-объектом. Эти методы доступны благодаря СОМ-интерфейсам. Клиенту достаточно знать несколько базовых интерфейсов СОМ-объекта, чтобы получить полную информацию о составе свойств и методов объекта. СОМ-объект может содержать один или несколько интерфейсов. Для программиста СОМ-объект работает так же, как и класс в Object Pascal.
В данном разделе мы с вами рассмотрели COM- объекты. Дали им характеристику, объяснили принцип работы, обозначили основные элементы работы данного программного обеспечения. Далее мы с вами продолжим рассматривать технологию COM, и раскрывать остальные стороны ее работы.
Свойства COM-технологии
СОМ-серверы
В данной главе мы раскроем сущность свойств, уже знакомой нам, COM- технологии. Раскроем основные аспекты работы данных свойств, их значимость в данной программе. Об этом речь пойдет на протяжении всей главы. Для начала мы поговорим о COM- серверах. Здесь мы обозначим для себя, что значат данные, серверы, и какую роль выполняют? Но чтобы ответить на этот вопрос в полной мере, нам нужно будет дать конкретное определение понятию «COM-СЕРВЕР».
СОМ-сервер является приложением или библиотекой, которая предоставляет услуги приложению-клиенту или библиотеке. СОМ-сервер содержит в себе один или более СОМ-объектов, где они, в свою очередь, выполняют функцию в качестве набора свойств, методов и интерфейсов.
Клиенты не знают, как СОМ-объект выполняет свои действия. СОМ-объект предоставляет свои услуги при помощи интерфейсов. В дополнение, приложению-клиенту не нужно знать, где находится СОМ-объект. Технология СОМ обеспечивает прозрачный доступ независимо от местонахождения СОМ-объекта.
Когда клиент запрашивает услугу от СОМ-объекта, он передает СОМ-объекту идентификатор класса (CLSID). CLSID - всего лишь GUID, который применяется при обращении к СОМ-объекту. После передачи CLSID, СОМ-сервер должен обеспечить так называемую фабрику класса (см. следующий раздел), которая создает экземпляры СОМ-объектов. Давайте рассмотрим в общих чертах, какие функции должен выполнять СОМ-сервер:
1. Проводить регистрацию данных в системном реестре Windows для того, чтобы была возможность связать модуль сервера с идентификатором класса (CLSID);
2. Предоставлять фабрику СОМ-класса, создающую копию СОМ-объектов;
3. Осуществлять механизм, который очищает из памяти серверы СОМ, которые в данный момент времени не предоставляют услуг клиентам.
СОМ-объекты представляют собой экземпляры coclass. Отметим еще одну не мало важную деталь- Coclass представляет класс, который поддреживает один или несколько интерфейсов. СОМ-объекты могут осуществлять только те услуги и запросы, которые обозначены в интерфейсах данного вида, а именно coclass. Давайте рассмотрим, как создаются некоторые виды экземпляров.
Экземпляры Cociass создаются при помощи специального типа объекта, называемого фабрикой класса.
Фабрика класса - это специальный СОМ-объект, который поддерживает интерфейс IclassFactory и отвечает за создание экземпляров того класса, с которым ассоциирована данная фабрика класса.
Интерфейс IclassFactory определен в модуле Delphi ActiveX так:
type
IClassFactory = interface (IUnknown)
['{00000001-0000-0000-COOO-000000000046}']
function Createlnstance (const unkOuter: lUnknown; const iid: TIID out obj): HResult; stdcall;
function LockServer (fLock: BOOL): HResult; stdcall;
end;
Как видно из вышеприведенной части кода, интерфейс имеет два метода:
Createlnstance и LockServer.
Метод Createlnstance создает экземпляр СОМ-объекта ассоциированной фабрики класса.
Метод LockServer применяется для хранения СОМ-сервера в памяти. Если параметр метода fLock имеет значение true, то счетчик ссылок сервера увеличивается, иначе - уменьшается. Когда счетчик достигает значения о, сервер выгружается из памяти.
Всякий раз, когда услуги СОМ-объекта запрашиваются клиентом, фабрика класса создает и регистрирует экземпляр объекта для конкретного пользователя. Если услугу того же СОМ-объекта запрашивает другой клиент, фабрика класса создает второй экземпляр объекта для обслуживания второго клиента. coclass должен иметь фабрику класса и идентификатор класса CLSID. Использование CLSID для cociass подразумевает, что они могут быть откорректированы всякий раз, когда в класс вводятся новые интерфейсы. Таким образом, в отличие от DLL, новые интерфейсы могут изменять или добавлять методы, не влияя на старые версии.
Мастер создания СОМ-объектов Delphi самостоятельно заботится о создании фабрики класса.
С использованием СОМ технологии клиент не должен беспокоиться о том, где располагается объект, он просто делает вызов интерфейса данного объекта. Технология СОМ устанавливает все необходимые шаги для того, чтобы сделать этот вызов. Шаги могут отличаться, в зависимости от местонахождения объекта. Объект может иметь место расположения в том же процессе, где и клиент, в другом процессе на том же компьютере, где расположен клиент, или на другом компьютере в сети. Так же существуют различные типы серверов, которые в зависимости от вышеперечисленных факторов применяются. Давайте рассмотрим некоторые из них:
1. В первую очередь сюда мы можем отнести внутренний сервер (In-process server);
2. Следующий у нас будет локальный сервер или, как его еще называют сервер вне процесса (Local server, Out-of-process server);
3. И заключающим у нас выступает удаленный сервер (Remote server). Вот мы вкратце привели примеры использования разных видов серверов, теперь давайте более подробно рассмотрим каждый из них. И обозначим основные их функции, на чем они базируются и, что из себя представляют.
Начнем мы с внутреннего сервера. Здесь мы может сказать, что данный вид сервера представляет собой библиотека DLL, которая запущена в одном процессе вместе с клиентом. Давайте для более подробного рассмотрения данного сервера мы приведем пример. Например, здесь может иметь место элемент управления ActiveX, который внедрен на Web-страницу и просматривается при помощи Internet Explorer или Netscape NavigatorПри этом элемент управления ActiveX загружен на клиентскую машину и находится в том же процессе, что и обозреватель Web. Приложение-клиент связывается с сервером внутри процесса при помощи прямых вызовов СОМ-интерфейса. На рис. 3.3. представлена схема взаимодействия клиента с внутренним сервером.
Схема, представленная на данном рисунке, показывает взаимодействие клиента с внутренним сервером.
Внутренний СОМ-сервер должен экспортировать четыре функции. Давайте рассмотрим их подробней:
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 внутреннего сервера (рис. 3.4).
- DllUnregisterServer - применяется для удаления всех разделов, подразделов и параметров, которые были созданы в системном реестре функцией DllRegisterServer при регистрации DLL СОМ-сервера.
- DllGetclassObject - возвращает фабрику класса для конкретного СОМ-класса.
- DllcanUnloadNow - применяется для определения, можно ли в настоящий момент времени выгрузить DLL СОМ-сервера из памяти. Функция проверяет, есть ли указатели на любой СОМ-объект данной DLL, если есть, то возвращает значение S_FALSE, т. е. DLL выгрузить нельзя. Если ни один СОМ-объект данной DLL не используется, то функция возвращает значение SJTRUE.
Путь к локальному СОМ-серверу в окне редактора системного реестра
Локальный сервер - это приложение ЕХЕ, которое может быть запущено в другом процессе, но на одном компьютере вместе с клиентом. Например, лист электронной таблицы Microsoft Excel связан с документом Microsoft Word. При этом два разных приложения работают на одном компьютере. Локальные серверы используют СОМ для соединения с клиентом.
Когда клиент и сервер находятся в различных приложениях, а также, когда они находятся на разных компьютерах в сети, СОМ использует внутренний (внутрипроцессный) прокси (In-process proxy) для реализации процедуры удаленного вызова. Прокси располагается в одном процессе вместе с клиентом, поэтому, с точки зрения клиента, вызов интерфейсов осуществляется так же, как и в случае, когда клиент и сер'вер находятся внутри одного процесса. Задача прокси заключается в том, чтобы перехватывать вызовы клиента и перенаправлять их туда, где запущен сервер. Механизм, который позволяет клиенту получать доступ к объектам, расположенным в другом адресном пространстве или на другом компьютере, называется маршалинг (marshaling).
Давайте определим основные факторы работы маршалинга:
1. Здесь мы можем указать, что принимать указатель интерфейса из процесса сервера и делать указатель прокси в процессе клиента доступным;
2. Передавать запросы вызовов интерфейса таким образом, как будто они произошли от клиента, и размещать аргументы в процесс удаленного объекта.
Для любого вызова интерфейса клиент помещает аргументы в стек, вызывает необходимую функцию СОМ-объекта через указатель интерфейса. Если вызов объекта произошел не внутри процесса, вызов проходит через прокси. Прокси упаковывает аргументы в пакет маршалинга и передает получившуюся структуру удаленному объекту. Заглушка (stub) объекта распаковывает пакет маршалинга, выбирает аргументы из стека и вызывает необходимую функцию СОМ-объекта.
Так, мы можем сделать вывод, что маршалинг – это некий процесс обработки и сортировки информации, а демаршалинг - процесс подачи информации. Данные процессы имеют прямую связь.
Тип маршалинга зависит от объектной принадлежности СОМ. Объекты могут применять стандартный механизм маршалинга, предоставляемый интерфейсом IDispatch. Стандартный тип маршалинга позволяет устанавливать связь при помощи стандартного системного удаленного вызова процедуры (Remote Procedure Call, RFC).
На рис. 3.5 изображена схема, котрая отображает работу взаимодействия клиента и сервера в случае, когда приложения работают на одном компьютере, но в разных приложениях.
Рис. 3.5. Схема взаимодействия клиента с сервером в разных процессах на одном компьютере
Локальный СОМ-сервер регистрируется в системном реестре Windows так же, как и внутренний СОМ-сервер.
Удаленный сервер - это библиотека DLL или иное приложение, запущенное на другом компьютере. То есть клиент и сервер работают на разных компьютерах в сети. Например, приложение базы данных, написанное с помощью Delphi, соединяется с сервером на другом компьютере в сети. Удаленный сервер использует распределенные СОМ-интерфейсы (Distributed COM, DCOM) для связи с клиентом.
Удаленный сервер работает также с помощью прокси. Различие в работе между локальным и удаленным сервером заключается в типе используемой межпроцессной связи. В случае локального сервера - это СОМ, а в случае удаленного сервера - DCOM. Схема взаимодействия клиента и удаленного сервера показана на рис. 3.6.
Рис. 3.6. Схема взаимодействия клиента с сервером на разных компьютерах.
В данном разделе мы рассмотрели свойства COM-сервера, обозначили их основные функции. Привели примеры и подробно их описали. Привели примеры в виде схем, показанных выше. Описали их, дали обозначения. Описали, как может происходить взаимосвязь клиента с сервером.
COM-клиенты. Расширение технологии COM
Вот мы подошли к следующему разделу, где поговорим о таком важном компоненте COM – технологии, как COM- клиентах. Здесь так же мы обозначим основные функции данного элемента, черты. Так же еще затронем расширение технологии COM, но об этом мы поговорим более подробно в следующей главе нашей научной работы, а пока мы введем в курс дела и расскажем основные элементы расширения данной программы. Приведем примеры не только в виде описания взаимодействия с другими программами, но и предоставим таблицу и схемы, которые будут более существенно и подробно раскрывать всю суть данных механизмов в нашем процессе.