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, ADsEnumerateNextund ADsFreeEnumerator.

ADsBuildEnumerator

Die ADsBuildEnumerator- Hilfsfunktion kapselt den Code, der zum Erstellen eines Enumerationsobjekts erforderlich ist. Sie ruft die IADsContainer::get__NewEnum-Methode auf, um ein Enumerationsobjekt 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 Automatisierungsmechanismus zum Aufzählen von Containern. Verwenden Sie die ADsFreeEnumerator--Funktion, um dieses Enumerationsobjekt freizugeben.

ADsEnumerateNext

Die ADsEnumerateNext Hilfsfunktion füllt ein VARIANT-Array mit Elementen auf, die aus einem Enumerationsobjekt abgerufen wurden. Die Anzahl der abgerufenen Elemente kann kleiner sein als die angeforderte Zahl.

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