Вспомогательные функции перечисления
Существует три вспомогательных функции перечислителя, которые можно использовать из C/C++, чтобы помочь в навигации объектов Active Directory. Они ADsBuildEnumerator, ADsEnumerateNextи ADsFreeEnumerator.
ADsBuildEnumerator
Функция ADsBuildEnumerator вспомогательной функции инкапсулирует код, необходимый для создания объекта перечислителя. Он вызывает метод IADsContainer::get__NewEnum для создания объекта перечислителя, а затем вызывает метод QueryInterfaceIUnknown, чтобы получить указатель на интерфейс IEnumVARIANT. Объект перечисления — это механизм автоматизации для перечисления по контейнерам. Используйте функцию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);
}