Что такое COM? - PullRequest
       35

Что такое COM?

22 голосов
/ 14 апреля 2009

Я долго искал, но не смог понять всю идею. Может кто-нибудь сказать мне:

  • Что такое COM на самом деле?
  • Как работают GUID и как они используются COM?
  • Как COM решает проблемы различных версий DLL.

Или, по крайней мере, указать мне где-нибудь хорошую статью, которая объясняет эти понятия? Спасибо!

Ответы [ 7 ]

16 голосов
/ 14 апреля 2009

COM - это "Компонентная объектная модель". Это одна из первых технологий, разработанных для «повторного использования» компонентов в двоичном формате. Первоначально это было переписано то, что в Microsoft Office примерно в 1988-1992 гг. Называлось Динамическим обменом данными (DDE), технология, позволяющая различным приложениям Office общаться друг с другом. Первая попытка переписать его была названа OLE-Automation (связывание и внедрение объектов). Но когда они закончили, они переименовали его в COM.

Как это работает:

По сути, до COM, когда клиентский компонент хотел использовать компонент (записанный как библиотека C ++), он должен был быть скомпилирован с библиотекой, чтобы он мог точно знать, сколько байтов в скомпилированном двоичном файле найти каждый вызов метода или функции.

В COM существует определенный механизм структурирования этих методов, и затем компилятор создает отдельный файл (называемый библиотекой типов или файлом языка определения интерфейса (IDL), который содержит все эти данные смещения функции .

Затем, как пользователь компонента, вы должны «зарегистрировать» его, который записывает всю эту информацию (отключенную от GUID) в реестр ОС, где любое клиентское приложение может получить к нему доступ, и считывая данные из реестр, он может знать, где в двоичном файле найти каждый метод или точку входа класса.

13 голосов
/ 14 апреля 2009

Ваш вопрос немного велик для полного объяснения здесь. Краткое высокоуровневое введение в COM можно найти в книге Понимание ActiveX и OL E. Более подробное, но все же вводное введение - Inside COM . Лучшая книга на эту тему - «Don 100» * Essential COM .

от Don Box.

Пара быстрых ответов:

  • COM - это двоичный стандарт интерфейса для объектов. Это позволяет различным программам писать в интерфейсы без необходимости написания одного и того же языка с одним и тем же компилятором. Также доступны сопутствующие услуги.
  • GUID - это глобально уникальные номера, которые COM использует для идентификации интерфейсов.
  • COM не решает проблемы с разными версиями DLL. Он позволяет регистрировать только одну DLL для каждого GUID.
6 голосов
/ 14 апреля 2009

COM позволяет повторно использовать программное обеспечение. Как и строительные блоки, вы можете создавать COM-объекты (или теперь сборки в .NET), чтобы обеспечить функциональность для большей части программного обеспечения. Я использовал COM для обеспечения интеграции БД для Excel и MS BizTalk. Программное обеспечение, такое как MS BizTalk, использует COM / Assemblies для расширения возможностей обработки стандартного процесса; Вы можете вставить COM в рабочий процесс сообщения, чтобы выполнить больше обработки, чем реализовано Microsoft. COM также позволяет использовать Сервисы Компонентов, обеспечивающие встроенный интерфейс пула объектов, безопасности и управления.

В Википедии есть хорошее определение GUID . Обратите внимание, что у Microsoft есть форматирование, которое не обязательно используется остальным сообществом разработчиков.

COM сам по себе не решает проблемы версии DLL. Это позволяет постепенно расширять программное обеспечение, если вы используете возможность управления версиями COM. Так что, если у вас есть приложение, которое использует COM для преобразования XML в текст (например), и вы хотите улучшить его, вы можете создать новую версию (2.0), которую вы можете медленно разворачивать при обновлении исходного приложения, чтобы использовать новый COM. Таким образом, вы можете (при необходимости) иметь оператор switch, который может по-прежнему использовать старый COM, если этого требуют системные ограничения, или использовать новый (это будут разные DLL).

3 голосов
/ 14 апреля 2009

COM это много разных вещей. Я рекомендую книгу Дона Бокса Essential COM как хороший способ учиться.

Как минимум, COM-объект - это объект, который предоставляет один интерфейс IUnknown. Этот интерфейс имеет 3 метода: AddRef, Release и QueryInterface. AddRef / Release позволяет подсчитывать ссылки на объект и автоматически удалять при освобождении последней ссылки. QueryInterface позволяет запрашивать объект для других интерфейсов, которые он поддерживает.

Большинство объектов COM доступны для обнаружения. Они зарегистрированы в реестре под HKEY_CLASSES_ROOT с идентифицирующим идентификатором GUID, который называется CLSID (идентификатор класса). Это позволяет вам вызывать CoCreateInstance для создания экземпляра зарегистрированного объекта, если вы знаете GUID. Вы также можете запросить реестр через COM API для CLSID, который поддерживает ProgId (идентификатор программы), который является строкой, идентифицирующей объект.

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

Некоторые объекты поддерживают запуск в другом процессе, в другом потоке или на другом компьютере. COM поддерживает сортировку для этих типов объектов. Если возможно, стандартный маршаллер может использовать typelib объекта для маршалинга вызовов объекта, но также могут быть предусмотрены и специальные маршаллеры.

И есть еще кое-что для COM-объектов, я едва царапаю поверхность.

1 голос
/ 14 апреля 2009

10 000 футов:

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

GUID объяснены довольно прилично в Википедии http://en.wikipedia.org/wiki/Globally_Unique_Identifier

Я всегда понимал, что файлы LIB являются объектными файлами для компоновщика C ++. Они содержат код для всех объектов в файле cpp. Компилятор оптимизирует, когда связывает игнорируемые части объектного файла, которые ему не нужны.

Кто-то, пожалуйста, уточните, я уверен, что я убил часть этого.

0 голосов
/ 14 апреля 2009

COM - это метод разработки программных компонентов, небольшого исполняемого файла, который предоставляет сервисы для приложений, ОС и других компонентов. Разработка собственного COM-компонента похожа на разработку объектно-ориентированного API. GUID является глобальным уникальным идентификатором и используется для уникальной идентификации компонента COM.

Вы можете сослаться на очень хорошую книгу Дейла Роджерсона для более подробной информации. Внутри COM

0 голосов
/ 14 апреля 2009

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

Если вы хотите узнать о COM с точки зрения C ++, взгляните на Essential COM или ATL Internals Дон Бокса от Rector and Sells.

Группа

microsoft.public.vc.atl , вероятно, является лучшим местом для вопросов, ответы на которые вы не можете получить здесь. В первую очередь это группа новостей ATL, но, похоже, это группа новостей с наибольшим трафиком для общих вопросов COM. (просто будьте готовы к обычной краткости и нетерпению группы новостей)

...