Перечисление элементов
При создании устройства функция получения образов Windows (WIA) создает иерархическое дерево элементов WIA, которые представляют устройство, а также папки и изображения, связанные с этим устройством. Используйте метод корневого элемента (элемент в корне дерева, представляющего устройство) IWiaItem::EnumChildItems (или IWiaItem2::EnumChildItems) для создания объекта перечислителя и получения указателя на его интерфейс IEnumWiaItem (или IEnumWiaItem2). используется для навигации по дереву элементов и получения доступа к изображениям или сканирующим кроватям, связанным с устройством.
В следующем примере показана функция, которая рекурсивно перечисляет все элементы дерева, начиная с корневого элемента, передаваемого в функцию.
HRESULT EnumerateItems( IWiaItem *pWiaItem ) //XP or earlier
HRESULT EnumerateItems( IWiaItem2 *pWiaItem ) //Vista or later
{
//
// Validate arguments
//
if (NULL == pWiaItem)
{
return E_INVALIDARG;
}
//
// Get the item type for this item.
//
LONG lItemType = 0;
HRESULT hr = pWiaItem->GetItemType( &lItemType );
if (SUCCEEDED(hr))
{
//
// If it is a folder, or it has attachments, enumerate its children.
//
if (lItemType & WiaItemTypeFolder || lItemType & WiaItemTypeHasAttachments)
{
//
// Get the child item enumerator for this item.
//
IEnumWiaItem *pEnumWiaItem = NULL; //XP or earlier
IEnumWiaItem2 *pEnumWiaItem = NULL; //Vista or later
hr = pWiaItem->EnumChildItems( &pEnumWiaItem );
if (SUCCEEDED(hr))
{
//
// Loop until you get an error or pEnumWiaItem->Next returns
// S_FALSE to signal the end of the list.
//
while (S_OK == hr)
{
//
// Get the next child item.
//
IWiaItem *pChildWiaItem = NULL; //XP or earlier
IWiaItem2 *pChildWiaItem = NULL; //Vista or later
hr = pEnumWiaItem->Next( 1, &pChildWiaItem, NULL );
//
// pEnumWiaItem->Next will return S_FALSE when the list is
// exhausted, so check for S_OK before using the returned
// value.
//
if (S_OK == hr)
{
//
// Recurse into this item.
//
hr = EnumerateItems( pChildWiaItem );
//
// Release this item.
//
pChildWiaItem->Release();
pChildWiaItem = NULL;
}
}
//
// If the result of the enumeration is S_FALSE (which
// is normal), change it to S_OK.
//
if (S_FALSE == hr)
{
hr = S_OK;
}
//
// Release the enumerator.
//
pEnumWiaItem->Release();
pEnumWiaItem = NULL;
}
}
}
return hr;
}
Функция принимает параметр pWiaItem, указатель на интерфейс IWiaItem (или IWiaItem2) корневого элемента дерева элементов для перечисления.
Во-первых, функция проверяет, является ли элемент папкой или имеет ли он вложения. В этом случае он вызывает метод IWiaItem::EnumChildItems (или IWiaItem2::EnumChildItems) pWiaItem для создания объекта перечислителя для дерева элементов. Если этот вызов выполняется успешно и перечислитель действителен, функция выполняет итерацию по дочерним элементам и рекурсивно вызывает себя для каждого элемента, рассматривая каждый из них как потенциальный корневой элемент для следующего уровня дочерних элементов.
Таким образом, функция перечисляет все ветви дерева элементов под корневым элементом, переданным в EnumerateItems.