Что такое объектная модель компонента (COM)? Это зависит от языка?

Я новичок в COM, и я не знаю, что это такое и почему он существует.

Является ли это методологией программирования, такой как OOP? Должны ли языки программирования поддерживать его? (с некоторыми специальными ключевыми словами или чем-то еще)

Когда я спросил об этом своего профессора, он сказал:

COM - это двоично-стабильный способ делать ООП. Нам нужно знать двоичный-макет (что-то.. что-то..)

Я понятия не имею, что это значит. Некоторые говорят, что он используется для повторного использования кода. ООП хорошо справляется с этим, поэтому почему именно этот СОМ развился в первую очередь?

Что это такое с С++ и COM? Там, где я вижу COM, он всегда описывается абстрактными примерами на С++. Это только для С++?

Может ли кто-нибудь показать мне случай или exmaple, чтобы я мог понять необходимость COM? Каковы требования для изучения этого, поэтому я могу написать свои собственные компоненты?

Ответ 1

COM по своей сути является способом предоставления контракта передачи данных, который не зависит от какого-либо конкретного языка. Это доказуемо не зависит от языка, так как существует много языков, поддерживающих COM (существуют реализации С++, C,.NET и Java)

На практике это полезно для нескольких различных примеров:

  • Связь между разными языками: поскольку COM не зависит от языка, можно использовать COM для передачи данных между компонентами на разных языках. Например, вы можете использовать COM для разговора между С++, Java и .NET.
  • Семантика Threading: COM позволяет определить семантику потоков для определенного компонента, чтобы убедиться, что он создан в соответствующем контексте потока независимо от того, где он используется.
  • Общая компонента.

Ответ 2

COM был впервые создан как механизм, позволяющий приложениям Microsoft Office взаимодействовать друг с другом, а затем на своей второй итерации он был изменен и расширен, чтобы стать спецификацией того, как компоненты двоичного кода могли бы - если бы они были построены согласно спецификация - обмениваются данными друг с другом и обмениваются данными независимо от того, на каком языке или ОС они были построены (если бинарный файл (скомпилированный .dll или .exe) соответствует спецификации COM).

Цель состояла в том, чтобы разрешить "двоичное повторное использование", что означает, что компонент кода может повторно использоваться несколькими компонентами клиентского кода, что исходный компонент кода ничего не знал и который даже не существовал, когда компонент был первоначально скомпилирован. Чтобы процитировать одного из оригинальных архитекторов COM, Don Box:

[...] Проектная парадигма COM заключалась в том, что контракты компонентов выражаются как определения типов. Это был шаг вперед от мира COM, в котором контракты были выражены только как простые функциональные точки входа. В этом отношении COM был крупным шагом вперед, поскольку он приводил динамическую загрузку кода и системы типов в достаточно последовательную,

Ответ 3

Подумав немного, я полагаю, что лучший способ выразить это, чтобы понять эту идею:

COM - это способ расширить Windows API и опубликовать другие пользовательские библиотеки в системе, чтобы вы могли одинаково открывать и работать с этими новыми API без необходимости перекомпилировать ваше приложение.

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

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

Отвечая на ваш вопрос в комментариях:

Для использования COM ничего не нужно устанавливать. Все уже существует в виде функций WinAPI, которые вы можете просто вызвать в своем приложении. DllGetClassObject и CoGetClassObject используются для создания объектов COM. CoRegisterClassObject используется для регистрации COM-объектов, содержащихся в ваших библиотеках в системе.

Чтобы обеспечить равномерное создание и взаимодействие с объектами COM, их создание было доверено фабрикам классов, это своего рода вспомогательные объекты. Вы вызываете CoGetClassObject и просите его дать вам возможность поговорить с классом factory объекта, который вам нужен. Учитывая интерфейс к этой библиотеке классов, вы просите его создать экземпляр объекта, который вам нужен. Затем вы можете манипулировать объектом через интерфейсы, которые он предоставляет.

Взгляните на этот краткий обзор в Википедии: Component Object Model

Ответ 4

Component Object Model - это стандарт, определенный Microsoft, для не зависящего от языка двоичного интерфейса объекта, то есть он позволяет передавать различные языки OO вокруг объектов и методов вызова на них.