열거형 도우미 함수
Active Directory 개체의 탐색을 지원하기 위해 C/C++에서 사용할 수 있는 세 가지 열거자 도우미 함수가 있습니다. ADsBuildEnumerator, ADsEnumerateNext 및 ADsFreeEnumerator입니다.
ADsBuildEnumerator
ADsBuildEnumerator 도우미 함수는 열거자 개체를 만드는 데 필요한 코드를 캡슐화합니다. IADsContainer::get__NewEnum 메서드를 호출하여 열거자 개체를 만든 다음, IUnknown의 QueryInterface 메서드를 호출하여 해당 개체의 IEnumVARIANT 인터페이스에 대한 포인터를 가져옵니다. 열거형 개체는 컨테이너를 열거하는 Automation 메커니즘입니다. 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);
}