Двойной интерфейс в COM является тем, который может быть полученным доступ через DispInterface или с помощью методов VTable.
Теперь кто-то может сказать мне, что точно, что различие между этими двумя методами?
Я думал, что VTable является виртуальной таблицей, которая содержит указатели на различные функции при реализации иерархии классов, которая имеет виртуальные функции, которые могут быть переопределены в дочерних классах. Однако я не вижу, как это связано с двойным интерфейсом в COM?
Основное отличие заключается в способе вызова методов объекта. В случае DispInterface вызов идет через метод IDispatch::Invoke (используется в скриптах или при отсутствии описания интерфейса) см. замечания. Этот метод значительно медленнее второго варианта. Во втором случае используется непосредственно VTable для вызовов методов (используется для вызовов из языков C++ или. NET)
Я хочу только ответить на дополнительные вопросы Тони.
Если вы хотите создать 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.
Короче говоря, COM - это двоичная спецификация, а не спецификация языка. На самом деле нет корреляции между двойными интерфейсами и производными классами в коде.Яблоки и апельсины.
Таблица VTable является «ранней привязкой», и поэтому это происходит быстрее. Вы знаете тип метода, который вызываете во время компиляции.
Использование DispInterface является «поздним связыванием» и поэтому медленнее, но более гибко. Он широко используется для написания сценариев. Типы методов и свойств определяются во время выполнения.
Надеюсь, это краткое объяснение поможет.