Udostępnij za pośrednictwem


Późne wiązanie (Late Binding) a dostęp do tabeli Vtable w modelu rozszerzania ADSI

Podwójny interfejs umożliwia bezpośredni dostęp do tabeli wirtualnej do wszystkich funkcji, podczas gdy interfejs wysyłania tego nie robi. Klient C/C++ może wykonywać zapytania dotyczące wskaźnika podwójnego interfejsu i używać bezpośredniego dostępu do tabeli wirtualnej w celu wywołania jego funkcji. Zapewnia to szybszy dostęp niż wywoływanie funkcji używając IDispatch::GetIDsOfNames i IDispatch::Invoke. Jest to szczególnie istotne w modelu rozszerzenia, ponieważ wszystkie podwójne interfejsy w obiekcie rozszerzenia muszą najpierw delegować swoje funkcje GetIDsOfNames i Invoke z powrotem do agregatora (ADSI). Następnie agregator musi wykonać dodatkowe kroki wewnętrzne w celu zidentyfikowania, który obiekt rozszerzenia, w tym ewentualnie sam agregator, zapewnia wsparcie dla wywołanej funkcji i przekierowuje wywołanie do odpowiedniego obiektu.

Visual Basic wywołuje również funkcję podwójnego interfejsu przy użyciu bezpośredniego dostępu do vtable, jeśli ma wskaźnik do interfejsu i dostęp do danych typu z biblioteki typów. Klienci ADSI napisani w języku Visual Basic mogą określić wskaźnik do podwójnego interfejsu, na przykład IADs, jawnie, a tym samym umożliwić dostęp do tablicy wirtualnej do funkcji w interfejsie.

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.

Ponieważ interfejs IDispatch nie obsługuje dostępu do tabel wirtualnych, ten przykład nie ma zastosowania. Oznacza to, że funkcja dispatche jest zawsze wywoływana wyłącznie za pośrednictwem funkcji IDispatch::GetIDsOfNames i IDispatch::Invoke.

Bieżące wersje języków VBScript i JScript również nie obsługują dostępu do tabel wirtualnych. W związku z tym podwójny interfejs w środowisku VBScript lub JScript działa jak interfejs wysyłania.