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