COM двойные интерфейсы

Двойной интерфейс в COM является тем, который может быть полученным доступ через DispInterface или с помощью методов VTable.

Теперь кто-то может сказать мне, что точно, что различие между этими двумя методами?

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

6
задан Compass 4 December 2014 в 20:06
поделиться

3 ответа

Основное отличие заключается в способе вызова методов объекта. В случае DispInterface вызов идет через метод IDispatch::Invoke (используется в скриптах или при отсутствии описания интерфейса) см. замечания. Этот метод значительно медленнее второго варианта. Во втором случае используется непосредственно VTable для вызовов методов (используется для вызовов из языков C++ или. NET)

3
ответ дан 16 December 2019 в 21:36
поделиться

Я хочу только ответить на дополнительные вопросы Тони.

Если вы хотите создать COM, который может быть доступен из VBScript / JScript или из старого «классического» ASP, вам необходимо реализовать IDispatch.

В Visual Basic 6 или в VBA MS Office можно использовать оба способа. Если вы добавите ссылку в свой COM, вы будете использовать «раннюю привязку» (IUnknown или VTable). Если вы используете свой COM в VB6 или VBA с CreateObject ("ProgIdName"), вы будете использовать "позднее связывание".

Очень важно понимать, что для того, чтобы сделать COM доступным из VB6 / VBA и т. Д. недостаточно просто реализовать интерфейс IUnknown. Вы должны создать и зарегистрировать библиотеку типов с атрибутом oleautomation . Для этого вы можете использовать в интерфейсе вашего COM только oleautomation совместимые типы данных (см. http://msdn.microsoft.com/en-us/library/aa367129% 28VS.85% 29.aspx ). Для понимания библиотеки типов играет роль DLL маршалинга клиента, поэтому она помогает клиентскому программному обеспечению, например VB6 / VBA, правильно отправлять данные в качестве параметров в ваш COM. Вы не должны забывать, что даже ваш COM будет сервером InProc, DLL, параметры не будут напрямую перенаправляться в COM, а должны быть маршалированы. Во время маршалинга копия данных будет создана в потоке, в котором запущен ваш COM. Это делает вашу COM-DLL потокобезопасной с одной стороны, и ваш COM не выйдет из строя, если поток, вызывающий ваш COM-метод, будет завершен до того, как COM вернет значение.

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

3
ответ дан 16 December 2019 в 21:36
поделиться

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

Таблица VTable является «ранней привязкой», и поэтому это происходит быстрее. Вы знаете тип метода, который вызываете во время компиляции.

Использование DispInterface является «поздним связыванием» и поэтому медленнее, но более гибко. Он широко используется для написания сценариев. Типы методов и свойств определяются во время выполнения.

Надеюсь, это краткое объяснение поможет.

2
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: