Freigeben über


Enumerationshilfsfunktionen

Es gibt drei Enumeratorhilfsfunktionen, die von C/C++ verwendet werden können, um die Navigation von Active Directory-Objekten zu unterstützen. Sie sind ADsBuildEnumerator, ADsEnumerateNext und ADsFreeEnumerator.

ADsBuildEnumerator

Die Hilfsfunktion ADsBuildEnumerator kapselt den Code, der zum Erstellen eines Enumeratorobjekts erforderlich ist. Sie ruft die IADsContainer::get__NewEnum-Methode auf, um ein Enumeratorobjekt zu erstellen, und ruft dann die QueryInterface-Methode von IUnknown auf, um einen Zeiger auf die IEnumVARIANT-Schnittstelle für dieses Objekt abzurufen. Das Enumerationsobjekt ist der Automation-Mechanismus zum Auflisten von Containern. Verwenden Sie die ADsFreeEnumerator-Funktion , um dieses Enumeratorobjekt freizugeben.

ADsEnumerateWeiter

Die Hilfsfunktion ADsEnumerateNext füllt ein VARIANT-Array mit Elementen, die von einem Enumeratorobjekt abgerufen werden. Die Anzahl der abgerufenen Elemente kann kleiner als die angeforderte Zahl sein.

ADsFreeEnumerator

Gibt ein Enumeratorobjekt frei, das zuvor über die ADsBuildEnumerator-Funktion erstellt wurde.

Das folgende Codebeispiel zeigt eine Funktion, die Enumeratorhilfsfunktionen in C++ verwendet.

/*****************************************************************************
  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);
}