Лучшее место для изучения компонентной объектной модели [закрыто]


13

Мне нужно изучить COM для моего текущего проекта. Я новичок, и я не смог найти хорошие отправные точки для COM. Я изучал MSDN и гуглил ... Я нашел несколько интересных статей на codeproject.com, но я не удовлетворен. Почему мы используем COM? Почему это существует? В каких местах он существует? ..... и так далее. Итак, скажите, пожалуйста, где я могу найти ответы на эти вопросы?


3
Почему мы используем COM? В основном мы стараемся не делать этого. В каких местах он существует? Болезненные унаследованные кодовые базы, как правило.
Carson63000

@ Carson Actully Я разрабатываю программное обеспечение для мониторинга, где мне нужно получить значения объектов "COM". Отсюда новый найденный квест ..
Chani

1
Если я правильно помню, из 3 лучших веб-статей о COM 2 были на MSDN (старая статья в журнале), а 1 на CodeProject ... очевидно, есть сотни других полезных статей, так что это похоже на поиск иголки в стоге сена. (и спасибо Google за то, что я возвращаю только сайты в домене ".com", когда я ищу "COM" ...)
rwong

@ Carson63000 Так правда, это больно ... сейчас заплачу в углу.
Evicatos

Ответы:


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

Изучение IUnknown является первым шагом.

Хорошим COM-интерфейсом, который подходит для начинающих, является интерфейс IStream. Вы можете попрактиковаться в COM, внедрив интерфейс IStream, используя множество способов хранения данных.


Добавлено 2012/09/28:

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

Документация Microsoft на MSDN тратит много времени, говоря, что «COM is not ...» или «не делайте предположений», объясняя, как эти необычные трюки могут сломать ваш код.

Разработчики COM используют принцип подстановки Лискова («L» в SOLID ), чтобы убедиться, что их множественные интерфейсы и использование трюков не лишают законной основы ООП или работу программы.

Если ваш проект не использует эти приемы, то можно увидеть COM только с точки зрения ООП. Если ваш проект использует эти приемы, вам нужно будет видеть COM как самоизменяющийся код.

(Шутка: нам пришлось проводить столько времени с L, что мы обычно игнорируем четыре других принципа.)


9

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

При изучении COM нужно помнить, что в то время C ++ был королем, а приложения, называемые dll, использовали C. Не было общего ABI (как говорит @rwong), а COM был решением Microsoft.

Вероятно, стоит взглянуть на Active Template Library (ATL) для visual studio, что также упрощает использование COM.

Несколько книг, которые я нашел полезными в те дни

http://www.amazon.com/Essential-COM-Don-Box/dp/0201634465/ref=sr_1_1?ie=UTF8&qid=1304946825&sr=8-1

http://www.amazon.com/Understanding-ActiveX-OLE-Developers-Technology/dp/1572312165/ref=pd_sim_b_4

НТН


7

Изначально я узнал о COM из книги « Изучение DCOM» (DCOM - это просто расширение COM, книга в основном о COM). Ему более десяти лет, и он должен быть дешевым, если вы его используете (поскольку COM уже не совсем горячий, даже в мире Microsoft, хотя он все еще используется для взаимодействия).

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

Система поддерживает некоторые функции, которые были хороши до того, как все стало управляемым (например, подсчет ссылок и самоописание (через IDispatch)).


5

COM - это стандарт, созданный в 90-х годах, чтобы позволить различным программам общаться друг с другом. Наиболее важным является двоичный стандарт, который позволяет одному программному обеспечению создавать или связывать объект, а затем вызывать этот интерфейс. Это позволяет вам делать такие вещи, как создание библиотеки DLL на C ++, которую можно вызывать на странице ASP (объекты COM), или создание элемента управления в Delphi, который можно поместить в диалоговое окно VB (элементы управления ActiveX) или на лист Excel. Когда вы вставляете изображение в Word, оно тоже использует COM, встраивая отдельное приложение в Word. Менее популярным является DCOM, который должен вызывать удаленные объекты, обычно есть более простые способы сделать это.

Итак, 10 лет назад Com / ActiveX / DCOM были очень популярны среди VB, VBA, C ++ / ATL, Delphi. Dotnet намного проще, хотя C # заменил большинство использования COM, VB и т. Д.

Тем не менее, существует множество COM-интерфейсов, которые вы можете вызывать из приложения dotnet, Java или C ++. (Вы не говорите)

Если вам нужно вызвать COM-интерфейсы, VB - самый простой способ сделать это. В Dotnet 4.0 C # имеет ключевое слово dynamic, которое значительно упрощает вызов интерфейсов IDispatch, что, вероятно, является отличным решением, на которое следует обратить внимание.

Если вам нужно знать много деталей, вам действительно нужно использовать C ++ и ATL, вызвать API-интерфейсы C, такие как CoCreateInstance. Избегайте этого, если вы можете использовать его как старую технологию и не очень много, придерживайтесь рекомендаций выше.

Я не уверен, какое программное обеспечение для мониторинга вы просматриваете, но оно, вероятно, будет доступно через классы System.Management в dotnet.


2

Следующее может быть полезным COM обзорM:

Первое видео рассказывает об общей идее создания бинарных компонентов для повторного использования кодов, написанных на разных языках (не зависящих от языка) и находящихся на разных машинах (процессах) (не зависящих от местоположения / прозрачных). Эта технология используется в некоторых софтверных компаниях для интеграции с другим программным обеспечением (компаниями) вместо того, чтобы покупать их программное обеспечение и встраивать их в свои собственные или писать коды с нуля в своих системах.

Эта технология имеет три разные версии (реализации):

OLE / COM / DCOM / ActiveX для разработчиков на C ++ (ATL используется для облегчения работы программиста)

JavaBeans / RMI / EJB для разработчиков Java

CORBA / IIOP

Просто думайте об этом как о технологии, которая пригодится, когда у вас есть программное обеспечение, написанное на Java, и вы хотите добавить к нему функциональность, которая уже существует в пакете, но написана на C ++ и даже, возможно, находится на другом компьютере, а не в ваша локальная машина. Как вы называете «новым», как вы делаете объекты и вызываете методы из них?

Следующие книги, которые я видел у людей, занимающихся кодированием COM, имеют одну из них на своих полках:

  • Семинар разработчика для COM и ATL 3.0

  • Внутри ком

  • Essential COM

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.