Разница между традиционной DLL и COM DLL - PullRequest
28 голосов
/ 10 июня 2010

Я сейчас изучаю COM.Я обнаружил, что COM DLL построена на традиционной инфраструктуре DLL.Когда мы создаем COM DLL, мы все еще полагаемся на традиционные методы экспорта DLL, чтобы привести нас к внутренним COM-классам COM.

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

В настоящее время у меня есть ощущение, что традиционные библиотеки DLL предоставляют методы " flat "в то время как COM DLL предоставляет методы в иерархической манере " OOP ".И манера ООП, кажется, лучший подход.Может ли это быть причиной, почему преобладает COM?

Большое спасибо.

Ответы [ 8 ]

34 голосов
/ 10 июня 2010

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

Вы не получите этого от непосредственного раскрытия своих собственных функций.Скорее всего, его можно будет использовать только из программы, написанной на C / C ++ (чтобы он мог читать ваши заголовочные файлы), скомпилированной с точно такой же версией компилятора C ++, и при этом нет недостатка во всех видах проблем взаимодействия.Простое предоставление объекта класса C ++, такого как std :: string, небезопасно.Ни расположение памяти не гарантируется совместимостью, ни протокол владения памятью.

Это может быть больше OOPy, COM не поддерживает наследование, потому что OOP очень трудно получить совместимость на двоичном уровне.Эта проблема требует поддержки во время выполнения, которую покупает весь код, такие как .NET и Java.

15 голосов
/ 10 июня 2010

COM DLL - это просто DLL с точками входа, специфичными для Com.COM предоставляет фабрики классов для создания com-объектов, поэтому должен быть способ получить доступ к одной из фабрик классов, реализованных COM-сервером.Это то, что делает DllGetClassObject.Кроме того, COM DLL являются саморегистрационными: они могут уведомлять Windows о доступных классах и интерфейсах.Точкой входа для наличия самого регистра DLL является DllRegisterServer.

Есть несколько других точек входа, но они находятся в этом направлении.

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

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

Относительно того, где COM отличается от 'C', основным отличием является концепция контрактов.COM поощряет программистов мыслить с точки зрения абстрактных интерфейсов между модулями, а не иерархической, нисходящей декомпозиции функциональности.Это один из видов «ООП», но этот термин слишком свободный, чтобы его можно было использовать, ИМО.Преимущества контрактно-ориентированного подхода многообразны для строго типизированных статически связанных языков, таких как C / C ++.

8 голосов
/ 16 июня 2010

Я думаю, прочитав первую главу Essential COM , вы поймете, почему вы используете COM.

Проще говоря, COM обеспечивает совместимость на двоичном уровне, независимо от того, какой язык вы использовали, какую версию компилятора вы использовали.Речь идет не о «ООП», вы наверняка могли бы представить класс C ++ из DLL, но они не «двоично совместимы».

5 голосов
/ 22 июня 2010

DLL имеет много применений в Windows. Многие типы библиотечного кода хранятся в DLL. Например, один из них - это сборки .net, это другой зверь.

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

Благодаря двойным интерфейсам очень удобно ссылаться на языки сценариев (используемые в Интернете, сценарии оболочки, образовательные программы и т. Д.), Поскольку программисты сценариев не заботятся о строгой типизации. Двойной интерфейс, предоставляемый COM DLL, позволяет среде выполнения сценариев точно запрашивать, какие типы он ожидает, и выполнять соответствующие приведения, незаметно для пользователя.

Такая гибкость позволила построить целую гигантскую инфраструктуру COM, включая регистрацию компонентов, DCOM (вызов по сети) и т. Д. Это сделало довольно удобным предоставление интерфейсов COM в компоненты Windows (например, WMI) и офисные компоненты. , Многие другие популярные интерфейсы были реализованы над COM, такие как ADO.

Все это хорошо, но COM не "превалирует" ни в каком смысле. COM DLL являются меньшинством DLL. Простые библиотеки DLL и библиотеки .NET очень популярны. Microsoft считает, что интерфейсы .net превосходят COM. Многие фанаты Unix и другие считают, что DLL - это вообще плохая идея, так как она не предоставляет сервисы компоновки во время выполнения в том же смысле, в каком всегда были общие объекты Unix. Несмотря на то, что я являюсь разработчиком Windows, я также думаю, что SO предоставляют превосходную альтернативу, и я надеюсь, что они появятся однажды.

5 голосов
/ 19 июня 2010

Ключевым отличием является то, что COM обеспечивает бинарную совместимость.

Если вы добавляете / удаляете функции и перестраиваете традиционную DLL, тогда любые клиентские приложения, скорее всего, потерпят неудачу, когда они попытаются использовать DLL, потому что они созданы наболее ранняя версия.

COM представил концепцию интерфейсов, которые являются неизменяемыми, поэтому их не следует изменять между сборками и т. д. Каждый объект COM должен реализовывать интерфейс IUnknown, который содержит метод QueryInterface, который используется для запроса объектауказатели на другие поддерживаемые интерфейсы.

Спецификация COM гарантирует, что интерфейс IUnknown всегда находится в одном и том же месте в DLL, поэтому даже если объект пересматривается для поддержки большего количества интерфейсов, метод QueryInterface все равно можно безопасно вызывать.

5 голосов
/ 10 июня 2010

Если вы хотите узнать о причинах введения COM и его философии, я настоятельно рекомендую прочитать От CPP до COM

4 голосов
/ 21 июня 2010

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

COM обрабатывает

  1. как версия вашего объектав разных выпусках
  2. как обнаружить ваш объект, даже если ваш объект находится в DLL, которая переименована или получена из другого источника
  3. как ссылаться и уничтожать ваш объект (относительно куч)
  4. как вы ожидаете, что многопоточность будет работать, и правила, окружающие многопоточность / блокировку для вашего объекта

COM стал стандартом, потому что в то время как вы могли бы сделать традиционную DLL, которая обрабатывает каждыйВы должны были сформулировать ожидаемый контракт, когда вы отправляете свою DLL

, используя правила COM, эта артикуляция сделана для вас

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

3 голосов
/ 22 июня 2010

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

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

Добавьте IDL и скомпилируйте библиотеку типов в DLL, и вы получите интерфейсы с самоописанием.При использовании простых DLL вы должны знать из внешних документов, какие у них есть методы и какие параметры они принимают.

Стандарт COM также может быть кроссплатформенным.Версии Office для Mac поддерживают COM, и для Unix и Unix-подобных систем были реализации, хотя они никогда не были популярны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...