ADSI 扩展模型中的后期绑定与 Vtable 访问

双接口可让 vtable 直接访问其所有功能,而调度接口则不行。 C/C++ 客户端可以查询双接口指针,并使用直接 vtable 访问来调用其函数。 这比使用 IDispatch::GetIDsOfNamesIDispatch::Invoke 函数来调用函数的访问速度更快。 在扩展模型中尤其如此,因为扩展对象中的所有双接口都必须首先将其 GetIDsOfNamesInvoke 功能委托给聚合器 (ADSI)。 然后,聚合器必须执行额外的内部步骤,以确定哪个扩展对象(可能包括聚合器本身)为所调用的函数提供支持,并将调用重定向到相应的对象。

如果 Visual Basic 有一个指向接口的指针,并且可以访问类型库中的类型数据,那么 Visual Basic 还可以通过直接访问 vtable 来调用双接口函数。 使用 Visual Basic 编写的 ADSI 客户端可以明确指定指向双接口(例如 IADs)的指针,从而启用 vtable 访问接口中的函数。

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::GetIDsOfNamesIDispatch::Invoke 函数来调用。

当前版本的 VBScript 和 JScript 也不支持 vtable 访问。 因此,VBScript 或 JScript 环境中的双接口就像一个调度接口。