열거형 도우미 함수

Active Directory 개체의 탐색을 지원하기 위해 C/C++에서 사용할 수 있는 세 가지 열거자 도우미 함수가 있습니다. ADsBuildEnumerator, ADsEnumerateNextADsFreeEnumerator입니다.

ADsBuildEnumerator

ADsBuildEnumerator 도우미 함수는 열거자 개체를 만드는 데 필요한 코드를 캡슐화합니다. IADsContainer::get__NewEnum 메서드를 호출하여 열거자 개체를 만든 다음, IUnknownQueryInterface 메서드를 호출하여 해당 개체의 IEnumVARIANT 인터페이스에 대한 포인터를 가져옵니다. 열거형 개체는 컨테이너를 열거하는 Automation 메커니즘입니다. ADsFreeEnumerator 함수를 사용하여 이 열거자 개체를 해제합니다.

ADsEnumerateNext

ADsEnumerateNext 도우미 함수는 VARIANT 배열을 열거자 개체에서 가져온 요소로 채웁니다. 검색된 요소 수는 요청된 수보다 작을 수 있습니다.

ADsFreeEnumerator

ADsBuildEnumerator 함수를 통해 이전에 만든 열거자 개체를 해제합니다.

다음 코드 예제에서는 C++에서 열거자 도우미 함수를 사용하는 함수를 보여 줍니다.

/*****************************************************************************
  Function:    TestEnumObject
  Arguments:   pszADsPath - ADsPath of the container to be enumerated (WCHAR*).
  Return:      S_OK if successful, an error code otherwise.
  Purpose:     Example using ADsBuildEnumerator, ADsEnumerateNext and
               ADsFreeEnumerator.
******************************************************************************/
#define MAX_ENUM      100  
 
HRESULT
TestEnumObject( LPWSTR pszADsPath )
{
    ULONG cElementFetched = 0L;
    IEnumVARIANT * pEnumVariant = NULL;
    VARIANT VariantArray[MAX_ENUM];
    HRESULT hr = S_OK;
    IADsContainer * pADsContainer =  NULL;
    DWORD dwObjects = 0, dwEnumCount = 0, i = 0;
    BOOL  fContinue = TRUE;
 
 
    hr = ADsGetObject(
                pszADsPath,
                IID_IADsContainer,
                (void **)&pADsContainer
                );
 
 
    if (FAILED(hr)) {
 
        printf("\"%S\" is not a valid container object.\n", pszADsPath) ;
        goto exitpoint ;
    }
 
    hr = ADsBuildEnumerator(
            pADsContainer,
            &pEnumVariant
            );
 
    if( FAILED( hr ) )
    {
      printf("ADsBuildEnumerator failed with %lx\n", hr ) ;
      goto exitpoint ;
    }
 
    fContinue  = TRUE;
    while (fContinue) {
 
        IADs *pObject ;
 
        hr = ADsEnumerateNext(
                    pEnumVariant,
                    MAX_ENUM,
                    VariantArray,
                    &cElementFetched
                    );

        if ( FAILED( hr ) )
        {
            printf("ADsEnumerateNext failed with %lx\n",hr);
            goto exitpoint;
        }
 
        if (hr == S_FALSE) {
            fContinue = FALSE;
        }
 
        dwEnumCount++;
 
        for (i = 0; i < cElementFetched; i++ ) {
 
            IDispatch *pDispatch    = NULL;
            BSTR        bstrADsPath = NULL;
 
            pDispatch = VariantArray[i].pdispVal;
 
            hr = V_DISPATCH( VariantArray + i )->QueryInterface(IID_IADs, (void **) &pObject) ;
 
            if( SUCCEEDED( hr ) )
            {
               pObject->get_ADsPath( &bstrADsPath );
               printf( "%S\n", bstrADsPath );
            }
            pObject->Release();
            VariantClear( VariantArray + i );
            SysFreeString( bstrADsPath );
        }
 
        dwObjects += cElementFetched;
    }
 
    printf("Total Number of Objects enumerated is %d\n", dwObjects);
 
exitpoint:
    if (pEnumVariant) {
        ADsFreeEnumerator( pEnumVariant );
    }
 
    if (pADsContainer) {
        pADsContainer->Release();
    }
 
    return(hr);
}