2009-10-29 3 views
11

Я новичок в COM, и я не знаю, что это такое или почему он существует.Что такое Component Object Model (COM)? Это зависит от языка?

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

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

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

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

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

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

+0

«Каковы требования для изучения этого, чтобы написать мои собственные компоненты?» Одно из ключевых соображений: вам нужно использовать COM для этих компонентов? В настоящее время COM - это, в основном, наследие: он нужен для сред, которые уже работают на базе COM, таких как Windows Explorer, но для большинства ситуаций вы, скорее всего, будете использовать .NET, с заменой DCOM на обмен сообщениями (например, WCF). Если у вас нет конкретного варианта использования, который требует COM (или вас обычно интересуют архитектуры компонентов), это, вероятно, не очень хорошая технология для изучения прямо сейчас. – itowlson

+2

Я думаю, что причина, по которой вы видите так много примеров на C++, - это компоновка в памяти COM-объекта, в точности такая же, как класс C++ с виртуальными функциями. Могут быть некоторые незначительные отличия, которые я не помню, но C++ может использовать COM-объекты напрямую, как минимум в большинстве случаев. – rmeador

ответ

7

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

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

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

>> «Есть много языков, поддерживающих COM» Итак, язык должен его поддерживать? как язык должен поддерживать ООП? Если да, то почему я никогда не слышал о «Component Oriented Language, как объектно-ориентированный язык»? – claws

+0

@claws. На самом деле возможно реализовать COM-уровень на языке без какой-либо специфической для языка поддержки. По существу, запись COM-сериализатора и прокси-сервера сообщений в качестве API. Я * думаю, что так работает реализация Java, но это было долгое время, так как я имел в виду это. – JaredPar

+4

COM абсолютно НЕ требует языковой поддержки. С самого начала было возможно создавать и использовать COM-объекты в простой форме. C. Отсутствие поддержки языка, просто куча макросов.Исходные C++-реализации COM также были основаны на макросах, без изменений языка; даже сегодня я думаю, что ядро ​​COM по-прежнему реализовано с помощью макросов, а не языковых изменений (есть вспомогательные типы, такие как _com_ptr_t, но это помощники, а не ядро). – itowlson

3

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

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

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

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

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

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

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

Посмотрите на этот краткий обзор на Википедии: Component Object Model

+0

Я вижу .. COM для MS Windows. JavaBeans, CORBA являются альтернативами для COM в других операционных системах. Правильно? Нужно ли мне устанавливать какое-либо программное обеспечение для использования COM-альтернативы для других ОС? Точно, какой компонент MSWindows будет управлять этими компонентами? – claws

+0

COM можно реально использовать в кросс-платформенной среде, это просто его типы должны быть поняты всеми клиентами, что не всегда так. – 2009-10-29 20:10:51

1

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

+1

Язык не обязательно должен быть OO. Возможно, хотя это действительно действительно странно, использовать языки, отличные от OO, такие как C, чтобы общаться с COM-компонентами. – JaredPar

5

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

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

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

Смежные вопросы