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