COM Dual Interfaces - PullRequest
       40

COM Dual Interfaces

6 голосов
/ 14 мая 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 14 мая 2010

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

3 голосов
/ 15 мая 2010

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

Если вы хотите создать 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).. Для понимания библиотеки типов играют роль клиентской библиотеки маршалинга, поэтому она помогает клиентскому программному обеспечению. как VB6 / VBA для правильной отправки данных в качестве параметров на ваш COM. Не забывайте, что даже ваш COM будет сервером InProc, DLL, параметры не будут перенаправлены непосредственно в COM, но их нужно маршалировать. маршалинг копии данных будет создан в потоке, в котором запускается ваш COM.Это делает поток COM DLL безопасным с одной стороны, и ваш COM не потерпит крах, если поток, вызывающий ваш метод COM, будет завершен до того, как COM вернет значение. 1011 *

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

2 голосов
/ 14 мая 2010

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

VTable является "ранней связью", и поэтому он быстрее. Вы знаете тип метода, который вы вызываете во время компиляции.

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

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

...