Какие файлы требуются COM-клиенту для подключения COM-сервера (внепроцессный сценарий)? - PullRequest
0 голосов
/ 28 апреля 2019

Я хотел бы понять назначение файлов, упомянутых в этой статье, и связать знания с моим текущим сценарием COM-сервера и COM-клиента, чтобы я мог реализовать свой COM-сервер для использования COM-сервера: this

У меня есть COM-сервер, который является exe или службой, которая работает в фоновом режиме. На данный момент я знаю, что существует открытый интерфейс, унаследованный от IUnknown и IDispatch. Кроме того, у меня созданы следующие файлы:

  1. xxx_i.c определяет все CLSID и IID

  2. xxx_i.h определяет все методы, поддерживаемые интерфейсом

  3. xxx_p.c?

  4. dlldata.c?

Сейчас я использую способ автоматизации IDispatch -> Invoke () для доступа к методам интерфейса. Хотя этот способ работает нормально без использования файлов, упомянутых выше, я все же хотел бы понять их назначение при использовании обычного способа IUnknown -> QueryInterface () для доступа к методам.

Так как я новичок в мире COM, будет приветствоваться любое предлагаемое чтение! Спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

В своей самой простой форме 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.

0 голосов
/ 28 апреля 2019

Запросы на чтение материала не входят в сферу охвата StackOverflow, но я не могу не рекомендовать основную работу Don Box: Essential COM , который находится в печати и доступен в виде книги в другом месте.Вот описание Дона темы:

Коробка, Дон.Основные COM.Addison-Wesley, 1998, с. 350:

COM основан на клиентских программах, заранее знающих определение интерфейса во время разработки.Это достигается либо через заголовочные файлы C ++ (для клиентов C ++), либо через библиотеки типов (для клиентов Java и Visual Basic).В общем, это не проблема, поскольку программы, написанные на этих языках, обычно проходят какую-то фазу компиляции перед развертыванием.Некоторые языки не проходят такую ​​фазу компиляции во время разработки и вместо этого развертываются в форме исходного кода для интерпретации во время выполнения.

Возможно, наиболее распространенным из таких языков являются языки сценариев на основе HTML (например, Visual BasicСкрипт, JavaScript), которые выполняются в контексте веб-браузера или веб-сервера.В обоих этих случаях текст сценария сохраняется в необработанном виде, встроенном в HTML-файл, и окружающая среда выполнения выполняет текст сценария на лету при разборе HTML.Чтобы обеспечить богатую среду программирования, эти среды позволяют сценариям вызывать методы для COM-объектов, которые могут быть созданы в самом тексте сценария или, возможно, в другом месте в потоке HTML (например, элемент управления, который также является частью веб-страницы).В этих средах в настоящее время невозможно использовать библиотеки типов или другие априорные средства, чтобы предоставить движку времени описание используемых интерфейсов.Это означает, что сами объекты должны помочь переводчику в переводе необработанного текста сценария в значимые вызовы методов.

Чтобы разрешить использование объектов из интерпретирующих сред, таких как Visual Basic Script и JavaScript, COM определяет интерфейс, который выражает функциональность интерпретации.


Tl; dr:Есть два способа сделать все в COM (игнорируя IInspectable и двойной интерфейс):

  1. IUnknownСтандартный вызов виртуального метода.Быстро, без лишнего кода.Требуется информация интерфейса времени компиляции (.h или .tlb) на клиентских вызовах
  2. IDispatch«Позднее связывание».Медленно, много интерпретирующего кода.Никакой клиентской компиляции или спецификации интерфейса не требуется.

Практически говоря, если вы не звоните из VBA, VBScript или у вас есть старые клиенты VB6, тогда вам лучше придерживаться только IUnknown.

...