次の方法で共有


ADSI拡張モデルでの遅延バインディングとvtableアクセス

デュアルインターフェイスを使用すると、ディスパッチインターフェイスではなく、すべての関数に直接vtableアクセスできます。 C/C++クライアントは、デュアルインターフェイスポインターを照会し、直接vtableアクセスを使用してその関数を呼び出すことができます。 これにより、IDispatch::GetIDsOfNames関数とIDispatch::Invoke関数を使用して関数を呼び出すよりも高速にアクセスできます。 これは、拡張モデルで特に当てはまります。これは、拡張オブジェクト内のすべてのデュアルインターフェイスが、最初にアグリゲーター (ADSI) にGetIDsOfNames関数とInvoke関数を委任する必要があるためです。 アグリゲーターは、アグリゲーター自体を含む可能性のある拡張オブジェクトを識別するために、追加の内部手順を実行し、呼び出された関数のサポートを提供し、適切なオブジェクトへの呼び出しをリダイレクトする必要があります。

また、Visual Basicは、インターフェイスへのポインターとタイプライブラリからの型データへのアクセスがある場合に、vtableへの直接アクセスを使用してデュアルインターフェイス関数を呼び出します。 Visual Basicで記述されたIADsクライアントは、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::GetIDsOfNames関数とIDispatch::Invoke関数のみを使用して呼び出されます。

VBScriptおよびJScriptの現在のリリースでは、vtableアクセスもサポートされていません。 そのため、VBScriptまたはJScript環境のデュアルインターフェイスは、ディスパッチインターフェイスのように実行されます。