Добавлен: 28.03.2023
Просмотров: 45
Скачиваний: 2
COM-компонент может не только работать в контексте вызывающего, но также может запускаться в другом процессе или (через DCOM) на другом компьютере. Межпроцессное взаимодействие и межмашинное взаимодействие облегчаются с помощью прокси на стороне клиента и на стороне сервера, как объяснено в разделе 2.2.3 (в COM это называется «прокси» и «заглушки» соответственно). COM поддерживает синхронные (блокирующие) и асинхронные (неблокирующие) вызовы компонентов, работающих вне процесса (Prosise 2000a) .4
Маршаллинг может автоматически обрабатываться COM, называемый стандартным маршаллингом. Опытные пользователи, которые хотят самостоятельно обрабатывать все аспекты сортировки, могут использовать настраиваемую сортировку. Последнее может быть предпочтительным для приложений, критичных к производительности, поскольку оно позволяет обрабатывать определенные операции без отсылки к удаленному серверу, тем самым сокращая межпроцессные или межмашинные вызовы. Пользовательский прокси на стороне клиента может, например, кэшировать данные в клиентском процессе и прозрачно работать в этом состоянии вместо обращения к удаленному объекту. Многие из преимуществ пользовательского маршаллинга могут быть получены с использованием внутрипроцессных обработчиков, без сложности предыдущего подхода. Внутрипроцессный обработчик может выбрать обработку некоторых операций локально, в то же время делегируя другие операции стандартному распределению (Prosise 2000b).
COM может использоваться с языком описания интерфейса COM IDL, но в качестве бинарного стандарта использование этого языка, строго говоря, необязательно. COM IDL - это расширенная версия IDL DCE, в частности добавление объектов к языку (Hludzinski 1998). Компилятор Microsoft IDL может генерировать прокси на стороне клиента и на стороне сервера, привязки к языку C / C ++, а также библиотеки типов. Библиотека типов - это нетекстовое, эффективное представление набора файлов IDL, которые могут быть развернуты в системах конечных пользователей в виде автономных файлов или встроены в качестве ресурсов в общие библиотеки или исполняемые файлы. по существу, хранилище информации о типах, доступной во время выполнения. Система времени выполнения COM может читать библиотеки типов и делать доступными в них данные через интерфейс ITypeInfo. Привязки к языкам обычно создаются не непосредственно из файлов IDL, а из библиотек типов, поскольку библиотеки типов - это объекты, которые развертываются в системах конечных пользователей.
Фабрики используются в COM для создания экземпляров классов. Для того чтобы класс был инстанцируемым, должна существовать реализация IClassFactory, которая может создавать экземпляр указанного класса. Компонент COM, который выполняется в процессе (и, следовательно, реализуется как разделяемая библиотека), должен экспортировать функцию, которая возвращает объект, реализующий IClassFactory для данного класса UUID, переданного в качестве аргумента. Компонент COM, который выполняется вне процесса на том же компьютере, реализован в виде стандартного исполняемого файла, который при запуске регистрирует свою фабрику классов в системе времени выполнения COM (Goswell 1995).
Одним из преимуществ COM является то, что он позволяет то, что Microsoft называет автоматизацией, - возможность для одной программы, обычно сценария, получать доступ к другой программе и управлять ею, что часто пишется в собственном коде. Сценарий, написанный на Visual Basic, может, например, использовать механизм построения диаграмм Microsoft Excel через Automation. Автоматизация позволяет приложениям предоставлять доступ к своим функциям в виде набора объектов COM.
Автоматизация подразумевает, что достоверность вызовов проверяется только во время выполнения, поэтому используется очень позднее связывание (см. Раздел 4.2). Традиционное решение в COM состоит в том, чтобы требовать, чтобы классы, которые хотят быть доступными через очень позднее связывание, реализовали интерфейс IDispatch, который аналогичен интерфейсу Scriptable, представленному в главе 4. (Классы, доступные как с поздним связыванием, так и с очень поздним связыванием, и таким образом реализовать IDispatch в дополнение к традиционным, специфичным для домена интерфейсам, которые, как говорят, используют двойные интерфейсы). IDispatch :: Invoke (), в отличие от Scriptable :: InvokeOperation (), не принимает строку, представляющую имя операции в качестве аргумента. Скорее, он принимает идентификатор отправки, который может быть получен во время выполнения с использованием IDispatch :: GetIDsOfNames (), предположительно из соображений эффективности. Если компонент поставляется с библиотекой типов, реализация интерфейса IDispatch может быть полностью синтезирована во время выполнения или просто путем переадресации вызовов в предоставляемую системой реализацию ITypeInfo.
Если компилятор создает классы, несовместимые с бинарным стандартом COM, эти классы нельзя использовать в качестве средств прямой реализации классов COM. Тем не менее, COM полностью доступен для любой программы, скомпилированной с собственным кодом, которая дает прямой доступ к памяти, такой как программы, написанные на C. Класс COM, написанный на C, не выглядит так уж сильно отличается от классов, представленных в Главе 4.
Бинарная совместимость с C ++ гораздо больше, чем доступ к объектам, созданным из чисто виртуальных классов. Это включает обработку исключений, информацию о типах среды выполнения, искажение имен и (возможно, множественное) наследование реализации (Clamage 2002). COM обходит многие из этих проблем - вместо исключений используются возвращаемые значения, наследование реализации не поддерживается, и искажение имен выше стандартизированного C не требуется, так как двоичный стандарт COM основан на таблицах диспетчеризации. Кроме того, COM предоставляет свои собственные стандарты для информации о типах во время выполнения в форме IUnknown :: QueryInterface () и библиотек типов.
На 32-разрядных компьютерах COM использует соглашение о вызовах stdcall вместо соглашения о вызовах thiscall, обычно используемого компилятором Microsoft C ++. Последнее соглашение о вызовах передает указатель this через регистр, а не в стек вызовов, тогда как stdcall передает все аргументы в стеке. C может легко поддерживать COM, так как большинство реализаций C для Windows поддерживают соглашение о вызовах stdcall. Поскольку вызываемый отвечает за очистку стека при использовании stdcall, это соглашение о вызовах (и, следовательно, COM) не может поддерживать переменные аргументы (операции, которые принимают определенное вызывающим абонентом количество аргументов).
Для выполнения межмашинных вызовов DCOM использует объектно-ориентированный вариант проводного формата DCE для удаленных вызовов процедур, который называется Object RPC (Eddon and Eddon 1998). DCOM связывается со службой, известной как диспетчер управления службами на удаленном компьютере, для обработки и маршрутизации вызовов между компьютерами. Эта служба выполняет функцию, аналогичную ORB в CORBA, которая обсуждается в разделе 5.4 (Szyperski et al. 2002: 341).
Библиотеки типов могут представлять только подмножество информации, содержащейся в файлах IDL. Например, библиотека типов не может представлять несколько выходных аргументов (Hunt and Scott 1999).
Заключение
Технологи COM оставила свою пусть и противоречивую, но объемную значимую в истории. Как видно из содержания курса распространение технологии (встраиваемые системы) и ее эволюция (COBRA) показало, что индустрия заинтересована в решениях основанных на переиспользуемых компонентах. Особенно критично это до времен всеобщей миниатюризации, когда аппаратная составляющая еще не была настолько относительно доступной, что заставляло задумываться над рациональным расходом материальных ресурсов машин. Было довольно много попыток возродить / видоизменить технологию взять тот же SOM или, один из самых популярных на сегодняшний день WebComponents, WASM - по сути является новой реинкарнацией классической модели. Приживется ли она в этот раз? Покажет время.