Компонентная объектная модель
Component Object Model (COM) — платформа Microsoft для программных компонентов , представленная в 1993 году . Эта платформа используется для обеспечения связи между процессами и динамического создания объектов на любом языке программирования, который поддерживает эту технологию. Термин COM часто используется в мире разработки программного обеспечения как общий термин для технологий OLE, OLE Automation, ActiveX, COM+ и DCOM. Хотя COM был представлен в 1993 году, Microsoft не выделяла имя COM до 1997 года.
По сути, СОМ — это способ реализации нейтральных к языку объектов, чтобы их можно было использовать в средах, отличных от той, в которой они были созданы, за пределами машины. Для хорошо созданных компонентов СОМ допускает повторное использование объектов без знания их внутренней реализации, потому что это заставляет разработчиков компонентов предоставлять четко определенные интерфейсы, которые отделены от реализации. Различная семантика выделения памяти обеспечивается за счет возложения на объекты ответственности за собственное создание и уничтожение посредством счетчика ссылок. Вы можете переходить между различными интерфейсами объекта, используя расширение QueryInterface(). Предпочтительным методом наследования в COM является создание подобъектов, которым делегируются вызовы методов (так называемая агрегация).
Хотя эти технологии реализованы на многих платформах, в основном они используются с программой Microsoft Windows . Ожидается, что COM будет заменен, по крайней мере в некоторой степени, Microsoft .NET и поддержкой веб-служб через Windows Communication Foundation (WCF). Сетевой DCOM использует проприетарные двоичные форматы, тогда как WCF использует сообщения SOAP на основе XML . COM также конкурирует с CORBA и JavaBeans как система компонентов программного обеспечения.
Технические детали
Программисты COM создают программное обеспечение, используя программные компоненты, поддерживающие COM. Различные типы компонентов идентифицируются идентификаторами типов (CLSID), которые являются глобальными уникальными идентификаторами или GUID. Каждый COM-компонент раскрывает свою функциональность через один или несколько интерфейсов. Различные интерфейсы, поддерживаемые компонентом, отличаются друг от друга с помощью идентификаторов интерфейса (IID), которые также являются идентификаторами GUID.
COM-интерфейсы имеют реализации на различных языках, таких как C, C++, Visual Basic и несколько языков сценариев, реализованных на платформе Windows. Весь доступ к компонентам осуществляется через методы интерфейсов. Это позволяет использовать такие методы, как межпроцессорная обработка и даже межкомпьютерное программирование (последнее благодаря поддержке DCOM).
Интерфейсы
Все COM-компоненты должны реализовывать по крайней мере стандартный интерфейс IUnknown , поэтому все COM-интерфейсы являются производными от IUnknown . Интерфейс IUnknown состоит из трех методов: AddRef()и Release(), реализующих подсчет ссылок и управление жизненным циклом интерфейса; и QueryInterface(), что путем указания IID позволяет вызову получать ссылки на различные интерфейсы, реализуемые компонентом. Эффект QueryInterface()похож на dynamic_cast <>C++ или castingC# и Java.
Интерфейсы COM-компонента должны отображать рефлексивные, симметричные и транзитивные свойства. Отражающее свойство относится к способности вызова для QueryInterface()заданного интерфейса с идентификатором интерфейса возвращать тот же экземпляр интерфейса. Симметричное свойство относится к тому факту, что когда интерфейс B извлекается из интерфейса A с помощью QueryInterface(), тогда интерфейс A также может быть извлечен из интерфейса B. Транзитивное свойство похоже на симметричное свойство, но требует, чтобы, если интерфейс B может быть получен из A, и C по очереди из B, то интерфейс C должен быть доступен из A.
Интерфейс состоит из указателя виртуальной функции, который содержит список указателей на функции, реализуемые функцией, объявленной в интерфейсе, в том же порядке, в котором они были объявлены в интерфейсе. Этот метод передачи указателя структурной функции очень похож на тот, который используется OLE 1.0 для связи с его библиотечной системой.
COM определяет множество других стандартных интерфейсов, используемых для связи между компонентами. Например, одним из них является IStream , который предназначен для компонентов с семантикой потока данных ( компонент FileStream , используемый для чтения и записи файлов). Он имеет ожидаемые методы чтения и записи для выполнения потокового чтения и записи. Другой стандартный интерфейс — IOleObject , предназначенный для компонентов, которые должны быть привязаны или встроены в контейнер. IOleObject содержит методы, которые позволяют заинтересованным лицам определять размер границ прямоугольного компонента, если компонент поддерживает такие операции, как «Открыть» , «Сохранить» и т. д.
Классы
Класс в COM называется coclass , который является сокращенной формой класса Component Object . Coclass — это способ COM определения класса в независимом от языка объектно-ориентированном смысле. Кокласс предоставляет конкретную реализацию одного или нескольких интерфейсов. В COM такие конкретные реализации могут быть написаны на любом языке программирования, который поддерживает разработку компонентов COM, например C++, Visual Basic и т. д.
Одним из величайших вкладов COM в мир разработки Windows является осознание концепции отделения интерфейса от реализации. Это осознание, несомненно, повлияло на то, как программисты строят современные системы. Расширением этой фундаментальной концепции является концепция одного интерфейса, нескольких реализаций. Это означает, что во время выполнения приложение может создать экземпляр интерфейса из одной из нескольких конкретных реализаций.
Язык определения интерфейса и библиотеки типов
Библиотеки типов содержат метаданные , представляющие COM-типы. Однако эти типы должны быть сначала описаны с использованием языка определения интерфейса Microsoft (MIDL). Это обычная практика при разработке COM-компонента, например, когда вы начинаете с определения типов с помощью IDL. Файл IDL — это то, что предоставляет COM, что позволяет разработчикам независимо определять объектно-ориентированные классы, интерфейсы, структуры, перечисления и другие определяемые пользователем типы в языке. COM IDL по внешнему виду похож на объявления C или C++ с добавлением ключевых слов, таких как «интерфейс» и «библиотека» , для определения интерфейсов и коллекций классов соответственно. IDL также требует использования заключенных в квадратные скобки атрибутов перед объявлениями для предоставления дополнительной информации, такой как GUID интерфейсов и взаимосвязь между параметрами указателя и длины полей.
Файл IDL компилируется компилятором MIDL несколькими способами для использования на разных языках. Для C/C++ компилятор MIDL создает независимый от компилятора заголовок, содержащий определения структур, которые соответствуют виртуальным функциям для объявления интерфейса, и файл C, содержащий идентификаторы GUID объявления интерфейса. Исходный код C++ для модуля Proxy также может быть сгенерирован компилятором MIDL. Этот прокси содержит методы- заглушки для преобразования вызовов COM в RPC, это разрешено DCOM.
Файл IDL также может быть скомпилирован компилятором MIDL в библиотеку типов (файл .TLB). Двоичные метаданные, содержащиеся в библиотеке, предназначены для обработки компиляторами языка и средами выполнения (VB, Delphi, .NET CLR и т. д.). Конечным результатом такой обработки TLB является создание специфичных для языка конструкций, которые представляют класс COM, определенный в .TLB (и, в конечном счете, класс, определенный в исходном файле IDL).
Подсчет ссылок
Самый важный из всех COM-интерфейсов, то есть IUnknown (от которого должны быть получены все COM-интерфейсы), поддерживает две основные концепции: запрос функций (или интерфейсов, реализуемых объектом) с помощью метода queryInterface()и управление жизненным циклом объекта с помощью включения AddRef ()и Release (). Функция подсчета ссылок и запросов применяется к объектам (не к каждому интерфейсу) и поэтому должна иметь централизованную реализацию.
В спецификациях СОМ требуется методика, называемая подсчетом ссылок, чтобы гарантировать, что различные объекты остаются в живых до тех пор, пока есть клиенты, получившие доступ к одному или нескольким их интерфейсам, и, наоборот, что один и тот же объект правильно удаляется после завершения всего кода. настоящее время, которое использует объект, сделано с ним и больше не требуется. COM-объект отвечает за освобождение собственной памяти, как только его счетчик ссылок уменьшается до нуля.
Для своего выполнения COM-объект обычно поддерживает значение, которое используется в качестве ссылки для подсчета. При вызове AddRef ()через любой из интерфейсов объекта это значение увеличивается. При вызове Release()это целое число уменьшается. AddRef ()и Release ()они являются единственным средством, с помощью которого клиент COM-объекта может влиять на его жизненный цикл. Внутреннее значение остается закрытым членом COM-объекта и никогда не будет доступно напрямую.
Создание
COM стандартизирует процесс инстанцирования (то есть создания) COM-объектов, требуя использования класса Factories . Для каждого созданного COM-объекта должны существовать два связанных параметра:
- Класс ID .
- Заводской класс .
Каждый COM-класс или CoClass должен быть связан с уникальным идентификатором класса (GUID). Он также должен быть связан с собственным классом Factory (что достигается с помощью централизованного реестра). Класс Factory сам по себе является COM-объектом. Это объект, который должен предоставлять интерфейс IClassFactory или IClassFactory2 (последний с лицензиями на поддержку). В обязанности такого объекта входит создание других объектов.
Класс Factory обычно содержится в том же исполняемом коде (то есть на сервере кода), что и сам COM-объект. Когда класс Factory вызывается для создания целевого объекта, целью этого объекта является идентификатор класса, который должен быть предоставлен. Вот как класс Factory узнает, какой класс объекта использовать.
Один класс объектов Factory может создавать объекты более чем одного класса. То есть два объекта с разными идентификаторами классов могут быть созданы одним и тем же классом объектов Factory . Однако это прозрачно для системы COM.
Делегируя ответственность за создание объекта отдельному объекту, достигается более высокий уровень абстракции, и у разработчика появляется больше гибкости.
Чтобы клиентские приложения получали классы объектов Factory , COM-серверы должны предоставлять их соответствующим образом. Класс Factory предоставляется по-разному, в зависимости от характера кода сервера. Сервер, основанный на библиотеках DLL, должен экспортировать глобальную функцию DllGetClassObject (). Серверный EXE-файл, основанный на классе Factory , регистрируется во время выполнения с помощью функции Windows API CoRegisterClassObject ().
Программирование
COM является двоичным стандартом и может быть разработан на любом языке программирования, способном понимать и реализовывать определенные двоичные типы данных и интерфейсы.
Библиотеки времени выполнения (в экстремальных ситуациях — программисты) отвечают за вход и выход из среды COM, создание экземпляров и подсчет ссылок на объекты COM, объекты для запроса информации о версии, кодирование для использования расширенных версий объектов.
Прозрачность приложений и сети
COM-объекты могут быть созданы и на них можно ссылаться внутри процесса, за границами процесса внутри компьютера и в сети с использованием технологии DCOM . Выход из процесса и удаленные объекты могут использовать сериализацию для отправки вызовов методов и возврата значений назад и вперед. Сериализация невидима для объекта и кода, использующего объект.
Критика
Сообщение о прокачке
Когда STA инициализируется, она создает скрытое окно, которое используется для маршрутизации сообщений между подразделениями и процессами. Очередь сообщений этого окна должна регулярно перекачиваться. Эта конструкция известна как бомба сообщения. В более ранних версиях Windows невыполнение этого требования могло привести к общесистемным сбоям. Эта проблема особенно неприятна, потому что некоторые API -интерфейсы Windows инициализируют COM как часть своего приложения, что приводит к утечке деталей реализации.
Подсчет ссылок
Подсчет ссылок в COM может вызвать проблемы, если на два или более объекта ссылаются циклически. Дизайн приложения должен учитывать это, чтобы объекты не были потеряны.
Объекты также могут оставлять активным подсчет ссылок, если в качестве используемой модели используется COM "sink case". Поскольку объекту, который запускает событие, требуется ссылка на объект, чтобы отреагировать на событие, счетчик ссылок на объект никогда не достигает нуля.
DLL ад
Поскольку расположение каждого компонента хранится в общесистемном расположении (в реестре Windows), может быть установлена только одна версия определенного компонента. Таким образом, COM сильно страдает от ада DLL , когда два или более приложений требуют разных версий одного и того же компонента.
В Windows XP представлен новый режим регистрации COM-объектов: «COM Free Registration». Эта служба позволяет приложениям, которым необходимо установить COM-объекты, хранить всю информацию реестра, необходимую для регистрации COM, в каталоге запросов, а не в глобальном реестре, где, строго говоря, используется только один запрос. Ада DLL можно избежать с помощью COM без реестра, единственное ограничение состоит в том, что для него требуется как минимум Windows XP или более поздние версии Windows и что его нельзя использовать для EXE, COM или общесерверных системных компонентов, таких как MDAC, MSXML , DirectX или Internet Explorer.
Ссылки
- Бергер, Дэн (2004). « COM: краткое введение » . Африканская история на About.com . Проверено 6 февраля 2006 г.
- Корпорация Майкрософт (2006 г.). « Компонентная объектная модель » . Архивировано из оригинала 18 марта 2006 г. Проверено 6 февраля 2006 г.
- Бокс, Дон (1998). Основной COM . Серия Addison-Wesley Object Technology . ISBN 0-201-63446-5 .
Смотрите также
- Объектная модель распределенных компонентов (DCOM)
- Динамический обмен данными (DDE)
- Майкрософт .NET (.NET)
- Связывание и внедрение объектов (OLE)
- программный компонент
- Компонентная разработка программного обеспечения
Внешние ссылки
- COM-технологии Майкрософт .
- Что такое OLE на самом деле , Крейг Брокшмидт. Обзор COM и OLE. (По-английски).
- Группа приложений компонентов в Microsoft Research .
- Проект Mozilla ActiveX (на английском языке).
- Введение в ком .
- ИНФОРМАЦИЯ: разница между элементами управления OLE и элементами управления ActiveX от Microsoft.