Поздняя привязка и Vtable Access в модели расширения ADSI
Двойной интерфейс обеспечивает прямой доступ к всем его функциям, а интерфейс диспетчера не поддерживается. Клиент C/C++ может запрашивать указатель с двумя интерфейсами и использовать прямой доступ к vtable для вызова ее функций. Это обеспечивает быстрый доступ, чем вызов функции с помощью функций IDispatch::GetIDsOfNames и IDispatch::Invoke. Это особенно верно в модели расширения, так как все двойные интерфейсы в объекте расширения должны делегировать свои функции GetIDsOfNames и Invoke сначала агрегатору (ADSI). Затем агрегатор должен выполнить дополнительные внутренние действия, чтобы определить, какой объект расширения, возможно, включая сам агрегатор, обеспечивает поддержку вызываемой функции и перенаправления вызова соответствующего объекта.
Visual Basic также вызывает функцию с двумя интерфейсами, используя прямой доступ к vtable, если он имеет указатель на интерфейс и доступ к данным типа из библиотеки типов. Клиенты ADSI, написанные в Visual Basic, могут указывать указатель на двойной интерфейс, например идентификаторы IAD, явным образом и таким образом разрешать виртуальный доступ к функциям в интерфейсе.
Dim inf as IADs
Set inf = GetObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com") ' An object that supports IADsDualInf.
inf.Get("name") 'IADs.Get() will be invoked through direct vtable access.
Так как интерфейс IDispatch не поддерживает доступ к vtable, этот пример не применяется. То есть функция диспетчера всегда вызывается только с помощью функций IDispatch::GetIDsOfNames и IDispatch::Invoke.
Текущие выпуски VBScript и JScript также не поддерживают доступ к vtable. Поэтому двойной интерфейс в среде VBScript или JScript выполняется как интерфейс диспетчера.