Funciones auxiliares de enumeración
Hay tres funciones auxiliares de enumerador que se pueden usar desde C/C++ para ayudar en la navegación de objetos de Active Directory. Son ADsBuildEnumerator, ADsEnumerateNext y ADsFreeEnumerator.
ADsBuildEnumerator
La función auxiliar ADsBuildEnumerator encapsula el código necesario para crear un objeto enumerador. Llama al método IADsContainer::get__NewEnum para crear un objeto enumerador y, a continuación, llama al método QueryInterface de IUnknown para obtener un puntero a la interfaz IEnumVARIANT de ese objeto. El objeto de enumeración es el mecanismo de Automatización para enumerar sobre contenedores. Use la función ADsFreeEnumerator para liberar este objeto enumerador.
ADsEnumerateNext
La función auxiliar ADsEnumerateNext rellena una matriz VARIANT con elementos capturados de un objeto enumerador. El número de elementos recuperados puede ser menor que el número solicitado.
ADsFreeEnumerator
Libera un objeto enumerador creado previamente a través de la función ADsBuildEnumerator .
En el ejemplo de código siguiente se muestra una función que usa funciones auxiliares del enumerador en 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);
}