В своей самой простой форме COM является только двоичным контрактом vtable
и матерью всех интерфейсов: IUnknown
.COM - это способ повторного использования кода без исходного кода, с компонентами , это своего рода механизм динамического приведения.При условии, что я знаю, какие классы вы поддерживаете (их CLSID
), интерфейсы, которые они предоставляют (их IID
), и какова структура этих интерфейсов, их параметры, порядок, тип и т. Д., Я могу использовать ваш COM-сервер.
Но чтобы упростить «связь» между вашими COM-клиентами и вашим COM-сервером, вы можете / должны использовать некоторые стандартные механизмы / документацию и добавить инструменты, чтобы такие штуки, как маршалинг (= сериализация), были решены с /о любое усилие.Это крайне важно в случае вне процесса, менее важно при работе в процессе (здесь я опущу концепцию «квартиры» ...)
Итак, многие вещи вы найдете в COM (как регистрация, инструментарий, IDL, typelibs и т. д.) на самом деле являются необязательными, но также очень полезными (так что они в конце концов становятся обязательными).Цель таких вещей, как idl
(для «определения языка интерфейса»), состоит в том, чтобы определить и предоставить вашим COM-клиентам то, что поддерживает ваш COM-сервер, так что инструменты могут автоматически генерировать много кода для вас и ваших клиентов (.c, .h.tlb).Обратите внимание, что ничто не мешает вам реализовать интерфейсы или классы, не определяя их в idl.Ничто не обязывает вас предоставлять ваш .idl или ваш .tlb.В этом случае я смогу использовать их только в том случае, если я знаю их IID, схему методов и т. Д.
Затем, поверх IUnknown
, Microsoft создала универсальный интерфейс под названием IDispatch
(это такжеизвестный как «Автоматизация» или «Позднее связывание», а не «Раннее связывание» для IUnknown
), в то время предназначенный для клиентов VB / VBA (даже до VBScript, JScript и многих других COM-клиентов .NET поддерживает IUnknownи IDispatch).IDispatch
, если вы пойдете по этому пути, может оказаться последним интерфейсом, который вам когда-либо придется реализовать, потому что его семантика позволяет полностью обнаруживать и вызывать любой метод, при условии, что он поддерживает конечный набор определенных типов данных, "Типы автоматизации"": BSTR, VARIANT и т. Д.
Итак, если вы поддерживаете IDispatch
, предоставляете TLB (typelibs) и ограничиваете все типы типами автоматизации, тогда вам не нужно обрабатывать маршалинг, вы неЕсли вам не нужны прокси и заглушки, обо всем этом можно забыть, даже в внепроцессных сценариях, потому что Microsoft реализует это автоматически.Когда-то мы называли «oleaut32.dll» «универсальным маршалером».
Двойные интерфейсы - это интерфейсы, которые поддерживают как IUnknown
, так и производные и IDispatch
одновременно.Они в основном существуют для поддержки клиентов C / C ++ и Automation одновременно.Использование автоматизации (BSTR, VARIANT и т. Д.) Немного болезненно в C / C ++, потому что они изначально не предназначались для использования клиентами C / C ++ ... Примечание. Microsoft предлагает классы умных оболочек C ++: CComBSTR
и CComVARIANT
с ATL или _variant_t
и _bstr_t
с Windows SDK.