~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ E62A8D34F3535DC9A70092722BD76B50__1709139420 ✰
Заголовок документа оригинал.:
✰ Component Object Model - Wikipedia ✰
Заголовок документа перевод.:
✰ Компонентная объектная модель — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Component_Object_Model ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/e6/50/e62a8d34f3535dc9a70092722bd76b50.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/e6/50/e62a8d34f3535dc9a70092722bd76b50__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 12:45:21 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 28 February 2024, at 19:57 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Компонентная объектная модель — Википедия Jump to content

Объектная модель компонента

Из Википедии, бесплатной энциклопедии

С
Объектная модель компонента
Сокращение С
Положение дел Действующий
Впервые опубликовано 1993 год ; 31 год назад ( 1993 )
Последняя версия Уровень жизни
2021
Организация Майкрософт
Ряд Системные службы
Базовые стандарты МИДЛ , UUID
Сопутствующие стандарты
Домен Интерфейс компонентов
Веб-сайт учиться .microsoft /en-нас /окна /win32 /модель-компонента-объекта

Модель компонентных объектов ( COM ) — это стандарт двоичного интерфейса для программных компонентов , представленный Microsoft в 1993 году. Он используется для межпроцессного взаимодействия (IPC) создания объектов в большом количестве языков программирования . COM является основой для нескольких других технологий и платформ Microsoft, включая OLE , OLE Automation , Browser Helper Object , ActiveX , COM+ , DCOM , оболочку Windows , DirectX , UMDF и среду выполнения Windows .

Суть COM — это нейтральный к языку способ реализации объектов, которые можно использовать в средах, отличных от той, в которой они были созданы, даже за пределами машинных границ. Для хорошо написанных компонентов COM позволяет повторно использовать объекты без знания их внутренней реализации, поскольку заставляет разработчиков компонентов предоставлять четко определенные интерфейсы , отделенные от реализации. Различная семантика распределения в языках учитывается путем возложения объектов на объекты, ответственные за их собственное создание и уничтожение посредством подсчета ссылок . Приведение типов между различными интерфейсами объекта достигается за счет QueryInterfaceметод. Предпочтительным методом « наследования » в COM является создание подобъектов, которым делегируются «вызовы» методов.

COM — это интерфейсная технология, определенная и реализованная в качестве стандарта только в Microsoft Windows и Apple Core Foundation 1.3 и более поздних версиях подключаемого интерфейса прикладного программирования (API). [1] Последний реализует лишь часть всего COM-интерфейса. [2] Для некоторых приложений COM был заменен, по крайней мере в некоторой степени, платформой Microsoft .NET и поддержкой веб-служб через Windows Communication Foundation (WCF). Однако COM-объекты можно использовать со всеми языками .NET через .NET COM Interop . Сетевой DCOM использует собственные двоичные форматы , а WCF поощряет использование XML на основе сообщений SOAP . COM очень похож на другие компонентного программного обеспечения технологии интерфейсов , такие как CORBA и Enterprise JavaBeans , хотя каждая из них имеет свои сильные и слабые стороны. В отличие от C++, COM предоставляет стабильный двоичный интерфейс приложения (ABI), который не меняется между выпусками компилятора. [3] Это делает COM-интерфейсы привлекательными для объектно-ориентированных библиотек C++, которые будут использоваться клиентами, скомпилированными с использованием разных версий компилятора.

История [ править ]

Одним из первых методов межпроцессного взаимодействия в Windows был динамический обмен данными (DDE). [4] впервые представлен в 1987 году, [5] это позволяло отправлять и получать сообщения в так называемых «разговорах» между приложениями. Энтони Уильямс , принимавший участие в создании архитектуры COM, позже распространил в Microsoft два внутренних документа, в которых рассматривалась концепция программных компонентов: « Объектная архитектура: работа с неизвестным (или) типобезопасностью в динамически расширяемой библиотеке классов в 1988 году» и О наследовании: что это значит и как его использовать в 1990 году. Они легли в основу многих идей, лежащих в основе COM. Связывание и внедрение объектов (OLE), первая объектная платформа Microsoft, была построена на основе DDE и разработана специально для составных документов . Он был представлен в Word для Windows и Excel в 1991 году, а позже был включен в Windows, начиная с версии 3.1 в 1992 году. Примером составного документа является электронная таблица , встроенная в документ Word для Windows: по мере внесения изменений в электронную таблицу в Excel они автоматически появляются внутри документа Word.

В 1991 году Microsoft представила расширения Visual Basic (VBX) вместе с Visual Basic 1.0. VBX — это упакованное расширение в виде библиотеки динамической компоновки (DLL), которое позволяет графически размещать объекты в форме и управлять ими с помощью свойств и методов . Позже они были адаптированы для использования другими языками, такими как Visual C++ . В 1992 году, когда была выпущена версия Windows 3.1 , Microsoft выпустила OLE 2 с базовой объектной моделью . COM Двоичный интерфейс -приложения (ABI) был таким же, как MAPI ABI (выпущенный в 1992 году), и, похоже, он был основан на MSRPC и, в конечном итоге, на Open Group DCE/RPC . В то время как OLE 1 был ориентирован на составные документы, COM и OLE 2 были разработаны для работы с программными компонентами в целом. Текстовые разговоры и сообщения Windows оказались недостаточно гибкими, чтобы обеспечить надежный и расширяемый обмен функциями приложения, поэтому COM был создан в качестве новой основы, а OLE заменен на OLE2. В 1994 году были представлены пользовательские элементы управления OLE (OCX) в качестве преемника элементов управления VBX. В то же время Microsoft заявила, что OLE 2 будет называться просто «OLE» и что OLE больше не является аббревиатурой, а является названием для всех компонентных технологий компании. В начале 1996 года Microsoft нашла новое применение для пользовательских элементов управления OLE, расширив возможности своего веб-браузера по представлению контента и переименовав некоторые части OLE, относящиеся к Интернет « ActiveX », и постепенно все технологии OLE были переименованы в ActiveX, за исключением технологии составных документов, которая использовалась в Microsoft Office . Позже в том же году Microsoft расширила COM для работы по сети с помощью DCOM . [6]

Сопутствующие технологии [ править ]

COM был основной платформой разработки программного обеспечения для Windows и, как таковой, повлиял на развитие ряда вспомогательных технологий. На него также сильно повлияли более ранние технологии.

ДДЕ [ править ]

COM заменил DDE в качестве предпочтительной формы межпроцессного взаимодействия.

DCE/RPC и MSRPC [ править ]

В качестве межъязыковой модели компонентов COM полагается на язык определения интерфейса (IDL) для описания объектов и связанных с ними функций. IDL COM в значительной степени основан на многофункциональном IDL DCE/RPC с объектно-ориентированными расширениями. Собственная реализация DCE/RPC от Microsoft, известная как MSRPC, широко используется в качестве основного механизма межпроцессного взаимодействия для служб и внутренних компонентов Windows NT, что делает ее очевидным выбором в качестве основы.

ДКОМ [ править ]

DCOM ( Distributed COM ) расширил возможности COM от простой поддержки одного пользователя с отдельными приложениями, взаимодействующими на рабочем столе Windows, до активации объектов, работающих в разных контекстах безопасности и на разных машинах в сети. При этом были добавлены необходимые функции для настройки того, какие пользователи имеют право создавать, активировать и вызывать объекты, для идентификации вызывающего пользователя, а также указания необходимого шифрования для безопасности вызовов.

COM+ [ править ]

Чтобы Microsoft могла предоставить разработчикам поддержку распределенных транзакций , объединения ресурсов, автономных приложений, публикации событий и подписки, лучшего управления памятью и процессором (потоками), а также позиционировать Windows как альтернативу другим операционным системам корпоративного уровня, Microsoft представила технологию под названием Microsoft Transaction Server (MTS) в Windows NT 4. В Windows 2000 это значительное расширение COM было включено в операционную систему (в отличие от серии внешних инструментов, предоставляемых MTS ) и переименовано в COM+ . В то же время Microsoft уменьшила значение DCOM как отдельного объекта. Компоненты, использующие службы COM+, обрабатывались более непосредственно добавленным уровнем COM+, в частности, за счет поддержки перехвата операционной системой. В первом выпуске МТС был добавлен перехват - установка компонента МТС модифицировала реестр Windows для вызова программного обеспечения МТС, а не непосредственно компонента. В Windows 2000 также было изменено приложение панели управления службами компонентов, используемое для настройки компонентов COM+.

Преимущество COM+ заключалось в том, что его можно было запускать в «фермах компонентов». Экземпляры компонента, если они закодированы правильно, могут быть объединены в пул и повторно использованы новыми вызовами его процедуры инициализации без выгрузки его из памяти. Компоненты также могут быть распределены (вызваны с другой машины). COM+ и Microsoft Visual Studio предоставили инструменты, упрощающие создание прокси на стороне клиента, поэтому, хотя для удаленного вызова использовался DCOM, разработчикам было легко это сделать. COM+ также представил механизм событий подписчика/издателя под названием COM+ Events и предоставил новый способ использования MSMQ (технологии, обеспечивающей асинхронный обмен сообщениями между приложениями) с компонентами под названием Queued Components . События COM+ расширяют модель программирования COM+ для поддержки событий позднего связывания (см. Позднее связывание ) или вызовов методов между издателем или подписчиком и системой событий.

.NET [ править ]

Microsoft .NET предоставляет средства как для обеспечения технологии компонентов, так и для взаимодействия с COM+ (через сборки COM-взаимодействия); .NET предоставляет оболочки для большинства часто используемых элементов управления COM. Microsoft .NET скрывает большую часть деталей при создании компонентов и, следовательно, упрощает разработку. .NET может использовать COM+ через пространство имен System.EnterpriseServices, а некоторые службы, предоставляемые COM+, были продублированы в последних выпусках .NET. Например, пространство имен System.Transactions в .NET предоставляет класс TransactionScope, который обеспечивает управление транзакциями без использования COM+. Аналогично, компоненты в очереди могут быть заменены Windows Communication Foundation транспортом MSMQ . (Однако MSMQ является собственным компонентом COM.) Поддержка обратной совместимости ограничена. COM-объект можно использовать в .NET путем реализации вызываемой оболочки среды выполнения (RCW). [7] NET-объекты, соответствующие определенным ограничениям интерфейса, можно использовать в COM-объектах путем вызова вызываемой оболочки COM (CCW). [8] Как со стороны COM, так и со стороны .NET объекты, использующие другую технологию, отображаются как собственные объекты. См. COM-взаимодействие .

WCF (Windows Communication Foundation) упрощает ряд проблем удаленного выполнения COM. Например, это упрощает прозрачную маршализацию объектов по значениям между границами процесса или машины.

Среда выполнения Windows [ править ]

Модель программирования и приложений Microsoft Windows Runtime (или WinRT, не путать с Windows RT ) по существу представляет собой API на основе COM, хотя и опирается на расширенный COM. Благодаря своей основе, подобной COM, среда выполнения Windows обеспечивает относительно простой интерфейс с несколькими языками, как и COM, но по сути это неуправляемый собственный API. Однако определения API хранятся в файлах «.winmd», которые закодированы в формате метаданных ECMA 335, том же формате метаданных CLI , который использует .NET, с некоторыми изменениями. Этот общий формат метаданных позволяет значительно снизить накладные расходы, чем P/Invoke, когда WinRT вызывается из приложений .NET, а его синтаксис намного проще.

Nano-COM (он же XPCOM) [ править ]

Nano-COM — это чрезвычайно небольшое подмножество компонентной объектной модели, ориентированное исключительно на двоичным интерфейсом приложения аспекты COM, связанные с (ABI), которые позволяют вызывать функции и методы в независимо скомпилированных модулях/компонентах. Nano-COM можно легко выразить в одном заголовочном файле C++, который можно переносить на все компиляторы C++. Nano-COM расширяет собственный ABI базовой архитектуры команд и ОС, добавляя поддержку ссылок на типизированные объекты (типичные ABI ориентированы только на атомарные типы, структуры, массивы и соглашения о вызове функций). Основа Nano-COM использовалась Mozilla для загрузки Firefox (называемого XPCOM ), и в настоящее время используется в качестве базовой технологии ABI для DirectX / Direct3D / DirectML .

Заголовочный файл Nano-COM определяет или называет как минимум три типа:

  • GUID для идентификации типов интерфейсов — фактически это 128-битное число;
  • HRESULT для идентификации кодов ошибок из вызовов методов — это фактически стандартизированное использование 32-битных целых чисел для хорошо известных значений (S_OK, E_FAIL, E_OUTOFMEMORY и т. д.);
  • IUnknown как базовый тип для всех ссылок на типизированные объекты — это фактически абстрактные виртуальные функции для поддержки. dynamic_cast<T>-стиль приобретения новых типов интерфейса и подсчета ссылок а-ля shared_ptr<T>.

Многие варианты использования Nano-COM также определяют две функции для обращения к буферам памяти, выделенным вызываемому абоненту, в качестве результатов.

  • <NanoCom>Alloc — вызывается реализациями метода для выделения необработанных буферов (не объектов), которые возвращаются вызывающему объекту.
  • <NanoCom>Free – вызывается вызывающими методами для освобождения буферов, выделенных вызываемым объектом, когда они больше не используются.

Некоторые реализации Nano-COM, такие как Direct3D, избегают функций распределителя и ограничиваются использованием только буферов, выделяемых вызывающей стороной.

В Nano-COM нет понятия классов, квартир, маршалинга, регистрации и т. д. Вместо этого ссылки на объекты просто передаются через границы функций и выделяются с помощью стандартных языковых конструкций (например, оператора new C++).

Безопасность [ править ]

Компоненты COM и ActiveX запускаются как собственный код на компьютере пользователя, без изолированной программной среды . Поэтому существует мало ограничений на то, что может делать код. Таким образом , предыдущая практика встраивания компонентов ActiveX в веб-страницы с помощью Internet Explorer приводила к проблемам с заражением вредоносным ПО . Microsoft осознала проблему ActiveX еще в 1996 году, когда Чарльз Фицджеральд сказал: «Мы никогда не заявляли заранее, что ActiveX по своей природе безопасен». [9] Недавний [ когда? ] версии Internet Explorer запрашивают у пользователя перед установкой элементов управления ActiveX, что позволяет пользователю запретить установку элементов управления с сайтов, которым пользователь не доверяет. Элементы управления ActiveX подписываются цифровыми подписями , гарантирующими их подлинность. Также можно полностью отключить элементы управления ActiveX или разрешить только некоторые из них. Прозрачная поддержка внепроцессных COM-серверов по-прежнему способствует безопасности программного обеспечения с точки зрения изоляции процессов . Это может быть полезно для разделения подсистем большого приложения на отдельные процессы. Изоляция процессов не позволяет повреждению состояния в одном процессе негативно повлиять на целостность других процессов, поскольку они взаимодействуют только через строго определенные интерфейсы. Таким образом, для восстановления допустимого состояния необходимо перезапустить только затронутую подсистему. Это не относится к подсистемам одного и того же процесса, где несанкционированный указатель в одной подсистеме может случайно повредить другие подсистемы.

Технические подробности [ править ]

, поддерживающие COM Программисты COM создают свое программное обеспечение, используя компоненты . Различные типы компонентов идентифицируются идентификаторами классов (CLSID), которые являются глобальными уникальными идентификаторами (GUID). Каждый COM-компонент реализует свою функциональность через один или несколько интерфейсов . Различные интерфейсы, поддерживаемые компонентом, отличаются друг от друга с помощью идентификаторов интерфейсов (IID), которые также являются GUID. COM-интерфейсы имеют привязки на нескольких языках, таких как C , C++ , Visual Basic , Delphi , Python. [10] [11] и несколько языков сценариев, реализованных на платформе Windows. Весь доступ к компонентам осуществляется через методы интерфейсов. Это позволяет использовать такие методы, как межпроцессное или даже межкомпьютерное программирование (последнее использует поддержку DCOM).

Интерфейсы [ править ]

Все компоненты COM реализуют интерфейс IUnknown ( custom ), который предоставляет методы для подсчета ссылок и преобразования типов (приведения). интерфейс Пользовательский IUnknown состоит из указателя на таблицу виртуальных методов , содержащую список указателей на функции, реализующие функции, объявленные в интерфейсе, в том же порядке, в котором они объявлены в интерфейсе. Таким образом, накладные расходы на внутрипроцессный вызов сравнимы с вызовами виртуальных методов в C++ . Помимо пользовательских интерфейсов, COM также поддерживает интерфейсы диспетчеризации , унаследованные от IDispatch . Интерфейсы диспетчеризации поддерживают позднее связывание для OLE-автоматизации . Это позволяет обеспечить естественный доступ к диспетчерским интерфейсам из более широкого диапазона языков программирования, чем к пользовательским интерфейсам.

Классы [ править ]

Класс COM («кокласс») представляет собой конкретную реализацию одного или нескольких интерфейсов и очень похож на классы объектно-ориентированных языков программирования. Классы создаются на основе их идентификатора класса ( CLSID ) или на основе их строки программного идентификатора ( ProgID ). Как и многие объектно-ориентированные языки, COM обеспечивает отделение интерфейса от реализации. Это различие особенно сильно проявляется в COM, где к объектам нельзя получить прямой доступ, а только через их интерфейсы. COM также поддерживает несколько реализаций одного и того же интерфейса, так что клиенты во время выполнения могут выбирать, какую реализацию интерфейса создавать.

определения интерфейса и типов библиотеки Язык

Библиотеки типов содержат метаданные для представления типов COM. Эти типы описываются с использованием языка определения интерфейса Microsoft (MSIDL/IDL). Файлы IDL определяют объектно-ориентированные классы, интерфейсы, структуры, перечисления и другие определяемые пользователем типы независимым от языка способом. IDL внешне похож на объявления C++ с некоторыми дополнительными ключевыми словами, такими как «интерфейс» и «библиотека», для определения интерфейсов и коллекций классов. IDL также поддерживает использование атрибутов в скобках перед объявлениями для предоставления дополнительной информации, такой как GUID интерфейса и связи между параметрами указателя и полями длины. Файлы IDL компилируются компилятором MIDL . Для C/C++ компилятор MIDL генерирует независимый от компилятора заголовочный файл, содержащий определения структур, соответствующие vtbls объявленных интерфейсов, и файл C, содержащий объявления GUID интерфейсов . Исходный код C++ для прокси-модуля также может быть сгенерирован компилятором MIDL. Этот прокси-сервер содержит заглушки методов для преобразования вызовов COM в удаленные вызовы процедур, позволяющие использовать DCOM для связи вне процесса. Файлы IDL также могут быть скомпилированы компилятором MIDL в библиотеку типов (TLB). Файлы TLB содержат двоичные метаданные, которые могут обрабатываться различными языковыми компиляторами и средами выполнения (например, VB, Delphi, .NET и т. д.) для создания специфичных для языка конструкций для представления типов COM, определенных в TLB. Для C++ это приведет к преобразованию TLB обратно в его представление IDL.

Структура объекта [ править ]

Поскольку COM — это среда выполнения, типы должны быть индивидуально идентифицируемыми и определяемыми во время выполнения. Для этого глобальные уникальные идентификаторы используются (GUID). Каждому типу COM назначается собственный GUID для идентификации во время выполнения. Чтобы информация о типах COM была доступна как во время компиляции, так и во время выполнения, COM использует библиотеки типов. Именно благодаря эффективному использованию библиотек типов COM достигает своих возможностей в качестве динамической среды для взаимодействия объектов.

Рассмотрим следующий пример определения coclass в IDL:

кокласс   SomeClass   { 
    [по умолчанию]   интерфейс   ISomeInterface; 
  }; 
 

Приведенный выше фрагмент кода объявляет COM-класс с именем SomeClass который реализует интерфейс с именем ISomeInterface.

Это концептуально эквивалентно определению следующего класса C++:

класс   SomeClass   :   public   ISomeInterface   { 
   ... 
   ... 
 }; 

C++ где ISomeInterface — это чистый виртуальный класс (иногда называемый абстрактным базовым классом).

Файлы IDL, содержащие интерфейсы и классы COM, компилируются в файлы библиотек типов (TLB), которые позже могут анализироваться клиентами во время выполнения, чтобы определить, какие интерфейсы поддерживает объект, и вызывать методы интерфейса объекта.

В C++ экземпляры COM-объектов создаются с помощью CoCreateInstanceфункция, которая принимает идентификатор класса (CLSID) и идентификатор интерфейса (IID) в качестве аргументов. Создание экземпляра SomeClass можно реализовать следующим образом:

ISomeInterface  *   интерфейс_ptr   =   NULL  ; 
  HRESULT   hr   =   CoCreateInstance  (  CLSID_SomeClass  ,   NULL  ,   CLSCTX_ALL  , 
                               IID_ISomeInterface  ,   (  void  **  )  &  interface_ptr  ); 

В этом примере подсистема COM используется для получения указателя на объект, реализующий ISomeInterface интерфейс, и требуется конкретная реализация этого интерфейса сокласса CLSID_SomeClass.

Подсчет ссылок [ править ]

Все COM-объекты используют подсчет ссылок для управления временем жизни объектов. Счетчики ссылок контролируются клиентами с помощью методов AddRef и Release в обязательном интерфейсе IUnknown, который реализуют все COM-объекты. COM-объекты затем отвечают за освобождение своей памяти, когда счетчик ссылок падает до нуля. Некоторые языки (например, Visual Basic ) обеспечивают автоматический подсчет ссылок, поэтому разработчикам COM-объектов не нужно явно поддерживать какой-либо внутренний счетчик ссылок в своих исходных кодах. В C++ программист может либо выполнять явный подсчет ссылок, либо использовать интеллектуальные указатели для автоматического управления счетчиком ссылок.

Ниже приведены рекомендации относительно того, когда вызывать AddRef и Release для COM-объектов.

  • Функции и методы, которые возвращают ссылки на интерфейс (через возвращаемое значение или через параметр «out»), перед возвратом должны увеличивать счетчик ссылок возвращаемого объекта.
  • Release должен быть вызван для указателя интерфейса до того, как указатель будет перезаписан или выйдет за пределы области действия.
  • Если копия сделана в указателе ссылки на интерфейс, AddRef должен быть вызван для этого указателя.
  • AddRef и Release должны вызываться для конкретного интерфейса, на который ссылаются, поскольку объект может реализовать подсчет ссылок для каждого интерфейса, чтобы выделить внутренние ресурсы только для интерфейсов, на которые ссылаются.

Не все вызовы счетчика ссылок передаются удаленным объектам по проводной сети; прокси-сервер сохраняет только одну ссылку на удаленный объект и поддерживает собственный счетчик локальных ссылок. Чтобы упростить разработку COM, Microsoft представила ATL (библиотеку активных шаблонов) для разработчиков C++. ATL обеспечивает парадигму разработки COM более высокого уровня. Это также защищает разработчиков клиентских приложений COM от необходимости напрямую поддерживать подсчет ссылок, предоставляя объекты интеллектуальных указателей . Другие библиотеки и языки, поддерживающие COM, включают классы Microsoft Foundation , поддержку COM компилятора VC , [12] VBScript , Visual Basic , ECMAScript ( JavaScript ) и Borland Delphi .

Программирование [ править ]

COM — это независимый от языка двоичный стандарт, который можно разработать на любом языке программирования, способном понимать и реализовывать двоично определенные типы данных и интерфейсы. Реализации COM отвечают за вход в среду COM и выход из нее, создание экземпляров COM-объектов и подсчет ссылок, запрос объектов для поддерживаемых интерфейсов, а также обработку ошибок. Компилятор Microsoft Visual C++ поддерживает расширения языка C++, называемые атрибутами C++ . [13] Эти расширения предназначены для упрощения разработки COM и удаления большей части шаблонного кода, необходимого для реализации COM-серверов на C++. [14]

Использование реестра [ править ]

В Windows классы COM, интерфейсы и библиотеки типов перечислены по GUID в реестре , в разделе HKEY_CLASSES_ROOT\CLSID для классов и HKEY_CLASSES_ROOT\Interface для интерфейсов. Библиотеки COM используют реестр для поиска либо правильных локальных библиотек для каждого COM-объекта, либо сетевого расположения для удаленной службы.

COM без регистрации [ править ]

COM без регистрации (RegFree COM) — это технология, представленная в Windows XP модели компонентных объектов (COM) , которая позволяет компонентам хранить метаданные активации и CLSID ( Class ID) для компонента без использования реестра . Вместо этого метаданные и CLSID классов, реализованных в компоненте, объявляются в манифесте сборки (описанном с помощью XML ), который хранится либо как ресурс в исполняемом файле, либо как отдельный файл, установленный вместе с компонентом. [15] Это позволяет устанавливать несколько версий одного и того же компонента в разные каталоги, описываемые собственными манифестами, а также развертывание XCOPY . [16] Этот метод имеет ограниченную поддержку серверов EXE COM. [17] и не может использоваться для общесистемных компонентов, таких как MDAC , MSXML , DirectX или Internet Explorer .

Во время загрузки приложения загрузчик Windows ищет манифест. [18] Если он присутствует, загрузчик добавляет информацию из него в контекст активации. [16] Когда фабрика классов COM пытается создать экземпляр класса, сначала проверяется контекст активации, чтобы определить, можно ли найти реализацию CLSID. Только если поиск не удался, реестр сканируется. [16]

Создание экземпляров COM-объектов вручную [ править ]

COM-объекты также можно создавать вручную, учитывая путь к файлу DLL и GUID объекта. Для этого не требуется регистрация DLL или GUID в системном реестре и не используются файлы манифеста. COM DLL экспортирует функцию с именем DllGetClassObject. Вызов DllGetClassObject с нужным GUID и IID_IClassFactory предоставляет экземпляр объекта фабрики . Объект Factory имеет метод CreateInstance, который может создавать экземпляры объекта с учетом GUID интерфейса. [19] Это тот же процесс, который используется внутри компании при создании экземпляров зарегистрированных COM-компонентов. [20]

Если созданный COM-объект создает экземпляр другого COM-объекта с помощью универсального API CoCreateInstance, он попытается сделать это обычным универсальным способом, используя файлы реестра или манифеста. Но он может создавать внутренние объекты (которые могут быть вообще не зарегистрированы) и передавать к ним ссылки на интерфейсы, используя свои собственные знания.

Прозрачность процессов и сети [ править ]

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

Нарезка [ править ]

В COM многопоточность рассматривается с помощью концепции, известной как апартаменты . [21] Отдельный COM-объект находится ровно в одном апартаменте, который может быть однопоточным или многопоточным. В COM существует три типа апартаментов: однопоточные апартаменты (STA) , многопоточные апартаменты (MTA) и нейтрально-потоковые апартаменты (NA). Каждая квартира представляет собой один механизм, посредством которого внутреннее состояние объекта может быть синхронизировано между несколькими потоками. Процесс может состоять из нескольких COM-объектов, некоторые из которых могут использовать STA, а другие — MTA. Все потоки, обращающиеся к COM-объектам, аналогично живут в одном апартаменте. Выбор места для COM-объектов и потоков определяется во время выполнения и не может быть изменен.

Тип квартиры Описание
Однопоточная квартира [22] ( STA ), (ThreadingModel= Квартира ) Один поток предназначен для выполнения методов объекта. При таком расположении вызовы методов из потоков за пределами подразделения маршалируются и автоматически ставятся в очередь системой (через стандартную очередь сообщений Windows). Таким образом, среда выполнения COM обеспечивает автоматическую синхронизацию, чтобы гарантировать, что каждый вызов метода объекта всегда выполняется до завершения, прежде чем будет вызван другой. Поэтому разработчику не нужно беспокоиться о блокировке потоков или условиях гонки.
Многопоточная квартира [23] ( MTA ), (ThreadingModel= Бесплатно ) Среда выполнения COM не обеспечивает синхронизацию, и нескольким потокам разрешено одновременно вызывать объекты COM. Поэтому COM-объектам необходимо выполнять собственную синхронизацию, чтобы предотвратить одновременный доступ из нескольких потоков, вызывающий состояние гонки. Вызовы объекта MTA из потока в STA также маршалируются.
Динамически определяемая квартира (ThreadingModel= Both ) В режиме «Оба подразделения» сервер автоматически выбирает STA или MTA при создании объекта в соответствии с типом подразделения вызывающего потока. [24] Это может быть полезно, чтобы избежать накладных расходов на маршаллинг, когда к серверам MTA обращается поток STA.
Потоко-нейтральная квартира ( NA ), (ThreadingModel= Neutral ) Особая квартира без каких-либо закрепленных тем. Когда поток STA или MTA вызывает объект NA в том же процессе, вызывающий поток временно покидает свою квартиру и выполняет код непосредственно в NA без какого-либо переключения потоков. [25] Следовательно, NA можно рассматривать как оптимизацию для эффективных вызовов межапартаментных методов.

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

Критика [ править ]

Поскольку COM имеет довольно сложную реализацию, программисты могут отвлекаться на некоторые «сантехнические» проблемы.

Перекачка сообщений [ править ]

Когда STA инициализируется, она создает скрытое окно, которое используется для маршрутизации сообщений между подразделениями и процессами. Очередь сообщений этого окна должна регулярно «накачиваться». Эта конструкция известна как « насос сообщений ». В более ранних версиях Windows невыполнение этого требования могло привести к общесистемным взаимоблокировкам. Эта проблема усложняется тем, что некоторые API-интерфейсы Windows инициализируют COM как часть своей реализации, что приводит к «утечке» деталей реализации.

Подсчет ссылок [ править ]

Подсчет ссылок в COM может вызвать проблемы, если на два или более объектов имеются циклические ссылки . При разработке приложения это необходимо учитывать, чтобы объекты не оставались бесхозными. Объекты также могут оставаться с активными счетчиками ссылок, если используется модель «приемника событий» COM. Поскольку объекту, который запускает событие, необходима ссылка на объект, реагирующий на событие, счетчик ссылок последнего никогда не достигнет нуля. Опорные циклы обычно разрываются с помощью внеполосного завершения или разделения идентификаторов. В методе внеполосного завершения объект предоставляет метод, который при вызове заставляет его удалить ссылки на другие объекты, тем самым разрывая цикл. В методе разделенной идентификации одна реализация предоставляет два отдельных COM-объекта (также известных как идентификаторы). Это создает слабую ссылку между COM-объектами, предотвращая цикл ссылок.

DLL Ад [ править ]

Поскольку внутрипроцессные COM-компоненты реализуются в файлах DLL, а регистрация допускает только одну версию для каждого CLSID, в некоторых ситуациях они могут подвергаться эффекту « DLL Hell ». Возможность COM без регистрации устраняет эту проблему для компонентов, находящихся в процессе обработки; COM без регистрации недоступен для серверов вне процесса.

См. также [ править ]

Примечания [ править ]

  1. ^ «Архив документации» . разработчик.apple.com .
  2. ^ «Плагины и COM от Microsoft» . Apple Inc. Проверено 5 октября 2010 г.
  3. ^ Форум Microsoft: Двоичная совместимость версий Visual C++.
  4. ^ «О сетевых DDE — приложениях Windows» . Microsoft.com . 30 мая 2018 г.
  5. ^ «Техника выполнения кода использует преимущества динамического обмена данными» . McAfee.com . 27 октября 2017 г.
  6. ^ Браун, Нина; Киндел, Чарли (11 марта 1998 г.). «draft-brown-dcom-v1-spec-03 — Протокол объектной модели распределенных компонентов — DCOM/1.0» . Ietf Datatracker . Проверено 29 августа 2019 г.
  7. ^ рпетруша. «Вызываемая оболочка среды выполнения» . msdn.microsoft.com .
  8. ^ рпетруша. «Вызываемая оболочка COM» . msdn.microsoft.com .
  9. ^ Стейнберг, Джилл (1 марта 1997 г.). «Конкурирующие компоненты вызывают раздражение участников дискуссии» . JavaWorld . Проверено 16 июля 2020 г.
  10. ^ «Указатель документации win32com» . docs.activestate.com .
  11. ^ «Питон и COM» . www.boddie.org.uk .
  12. ^ «Поддержка COM-компилятора» . MSDN . Майкрософт.
  13. ^ Microsoft MSDN: Справочник по атрибутам C++
  14. ^ Журнал MSDN: Атрибуты C++: упростите программирование COM с помощью новой функции в Visual Studio .NET
  15. ^ «Манифесты Ассамблеи» . MSDN . Проверено 5 ноября 2009 г.
  16. ^ Перейти обратно: а б с Дэйв Темплин. «Упростите развертывание приложений с помощью ClickOnce и COM без регистрации» . MSDN Журнал . Проверено 22 апреля 2008 г.
  17. ^ «Как использовать внепроцессный COM-сервер без его файла tlb» . Проверено 16 апреля 2011 г.
  18. ^ «Концепции изолированных приложений и параллельных сборок» . MSDN . Проверено 5 февраля 2016 г.
  19. ^ Архипов Михаил (1 апреля 2005 г.). «КОМ без регистрации» . Блоги MSDN . Проверено 29 апреля 2016 г.
  20. ^ «Точка входа DllGetClassObject (COM)» . MSDN . Если вызов функции CoGetClassObject находит объект класса, который должен быть загружен в DLL, CoGetClassObject использует экспортированную из DLL функцию DllGetClassObject.
  21. ^ Microsoft MSDN: процессы, потоки и апартаменты
  22. ^ Microsoft MSDN: Однопоточные апартаменты
  23. ^ Microsoft MSDN: Многопоточные апартаменты
  24. ^ Microsoft MSDN: понимание и использование моделей потоков COM
  25. ^ Codeguru: Понимание COM-квартир

Ссылки [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: E62A8D34F3535DC9A70092722BD76B50__1709139420
URL1:https://en.wikipedia.org/wiki/Component_Object_Model
Заголовок, (Title) документа по адресу, URL1:
Component Object Model - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)