다음을 통해 공유


ADSI 확장 모델의 지연 바인딩 및 Vtable 액세스

이중 인터페이스를 사용하면 디스패치 인터페이스가 없는 동안 모든 함수에 직접 vtable에 액세스할 수 있습니다. C/C++ 클라이언트는 이중 인터페이스 포인터를 쿼리하고 직접 vtable 액세스를 사용하여 해당 함수를 호출할 수 있습니다. 이렇게 하면 IDispatch::GetIDsOfNamesIDispatch::Invoke 함수를 사용하여 함수를 호출하는 것보다 더 빠르게 액세스할 수 있습니다. 확장 개체의 모든 이중 인터페이스가 GetIDsOfNamesInvoke 함수를 먼저 집계(ADSI)에 다시 위임해야 하기 때문에 확장 모델에서 특히 그렇습니다. 그런 다음 집계자는 추가 내부 단계를 수행하여 집계 자체를 포함하여 호출된 함수에 대한 지원을 제공하는 확장 개체를 식별하고 호출을 적절한 개체로 리디렉션해야 합니다.

또한 Visual Basic은 인터페이스에 대한 포인터와 형식 라이브러리의 형식 데이터에 대한 액세스 권한이 있는 경우 vtable에 대한 직접 액세스를 사용하여 이중 인터페이스 함수를 호출합니다. Visual Basic으로 작성된 ADSI 클라이언트는 이중 인터페이스(예: IAD)에 대한 포인터를 명시적으로 지정하여 인터페이스의 함수에 대한 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 환경의 이중 인터페이스는 디스패치 인터페이스처럼 수행됩니다.