Share via


조기 바인딩 지원

다음 코드 예제에서는 초기 바인딩이 지원되는 시나리오를 제공합니다.

Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2
 
Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales, 
                   DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")
 
Set y = x
y.MyNewMethod( "\\srv\public")
y.MyProperty = "Hello World"
 
Set z = y
z.OtherMethod()
z.OtherProperty = 4362
 
Debug.Print x.LastName
 
Set z = GetObject("LDAP://CN=Jeff,OU=Engr, 
                   DC=Fabrikam,DC=COM")
z.OtherProperty = 5323

이 코드 예제에서는 두 개의 확장 구성 요소가 사용자 개체를 확장합니다. 각 확장은 자체 인터페이스를 게시합니다. 각 확장은 다른 확장 인터페이스를 인식하지 못합니다. ADSI만 두 확장의 존재를 인식합니다. 각 확장은 해당 IUnknown 을 ADSI에 위임합니다. ADSI는 확장 및 기타 향후 확장 모두에 대한 집계 역할을 합니다. 확장 또는 ADSI에서 인터페이스를 쿼리하면 동일한 일관된 결과가 생성됩니다.

다음 절차에서는 확장을 만드는 방법을 설명합니다.

1단계: 구성 요소에 집계 추가

구성 요소에 집계를 추가하려면 COM 사양을 따릅니다. 요약하자면, CreateInstance 중에 구성 요소에 대한 pUnknown 요청을 수락하고 구성 요소가 집계되면 pUnknown을 집계자의 IUnknown에 위임해야 합니다.

2단계: 확장 등록

이제 확장할 디렉터리 클래스를 결정해야 합니다. 동일한 인터페이스를 사용하여 ADSI 인터페이스(예: IADsUser, IADsComputer)에 사용할 수 없습니다. 디렉터리 개체는 디렉터리에 유지되고 확장 및 ADSI는 클라이언트 컴퓨터에서 실행됩니다. 디렉터리 개체 예제는 사용자, 컴퓨터, printQueue, serviceConnectionPointnTDSService입니다. Active Directory에서 새 클래스를 추가하고 이 새 클래스에 대한 새 확장을 만들 수도 있습니다.

레지스트리 키를 사용하여 디렉터리 클래스 이름을 ADSI 확장 구성 요소와 연결합니다. 다음 그림은 기존 레지스트리 레이아웃과 새 키를 나타냅니다.

  • Extensions라는 새 키에는 각각 디렉터리의 클래스를 나타내는 키 목록이 포함되어 있습니다. 사용자 ,printQueue 또는 컴퓨터와 같은 각 클래스는 하위 키 목록을 유지 관리합니다.
  • 각 하위 키에는 ADSI 확장 구성 요소의 CLSID가 포함됩니다.
  • 각 CLSID 하위 키에는 여러 값을 허용하는 문자열 항목이 포함되어 있습니다. 집계에 참여하는 인터페이스만 나열해야 합니다.

참고

확장 개체는 표준 COM 키를 등록하는 데 여전히 필요합니다.

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         ADS
            Providers
               LDAP
                  Extensions
                     ClassNameA
                        CLSID of ExtensionA1
                           Interfaces = List of interfaces
                        CLSID of ExtensionA2
                           Interfaces = List of interfaces
                     ClassNameB
                        CLSID of ExtensionB1
                           Interfaces = List of interfaces
                        CLSID of ExtensionB2
                           Interfaces = List of interfaces

예제

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         ADs
            Providers
               LDAP
                  Extensions
                     printQueue
                        {9f37f39c-6f49-11d1-8c18-00c04fd8d503}
                           Interfaces = {466841B0-E531-11d1-8718-00C04FD44407}
                                        {466841B1-E531-11d1-8718-00C04FD44407}

Extension1의 인터페이스 목록은 Extension2의 인터페이스 목록과 다를 수 있습니다. 활성 상태인 개체는 집계(ADSI)의 인터페이스와 집계의 Extension1 및 Extension2에서 제공하는 모든 인터페이스를 지원합니다. 충돌하는 인터페이스의 해결(집계 및 집계 또는 여러 집계에서 지원하는 동일한 인터페이스)은 확장의 우선 순위에 따라 결정됩니다.

CLSID 확장을 여러 개체 클래스 이름과 연결할 수도 있습니다. 예를 들어 확장은 사용자연락처 개체를 모두 확장할 수 있습니다.

참고

확장 동작은 개체별 instance 아닌 개체별 클래스에 추가됩니다.

 

DllRegisterSvr 함수를 호출하여 다른 COM 구성 요소와 마찬가지로 확장을 등록하는 것이 좋습니다. 또한 DllUnregisterServer 함수를 사용하여 확장을 등록 취소하는 기능을 제공합니다.

다음 코드 예제에서는 확장을 등록하는 방법을 보여줍니다.

/////
// Register the class.
///////////////////////
hr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
                 _T("SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\User\\{E1E3EDF8-48D1-11D2-B22B-0000F87A6B50}"),
 0,
 NULL,
 REG_OPTION_NON_VOLATILE,
 KEY_WRITE,
 NULL,
 &hKey,
 &dwDisposition );
 
///////////////////////////
// Register the Interface.
///////////////////////////
const TCHAR szIf[] = _T("{E1E3EDF7-48D1-11D2-B22B-0000F87A6B50}");
 
hr = RegSetValueEx( hKey, _T("Interfaces"), 0, REG_BINARY, (const BYTE *) szIf, sizeof(szIf) );
 
RegCloseKey(hKey);
return S_OK;
 
}