Enumerazione degli elementi
Quando viene creato un dispositivo, Windows Image Acquisition (WIA) crea un albero gerarchico di elementi WIA che rappresentano il dispositivo e le cartelle e le immagini associate al dispositivo. Utilizzare il metodo dell'elemento radice (l'elemento nella radice dell'albero che rappresenta il dispositivo) IWiaItem::EnumChildItems (o IWiaItem2::EnumChildItems) per creare un oggetto enumeratore e ottenere un puntatore alla relativa interfaccia IEnumWiaItem (o IEnumWiaItem2), che viene usata per esplorare l'albero degli elementi e ottenere l'accesso alle immagini o ai letti di scansione associati al dispositivo.
Nell'esempio seguente viene illustrata una funzione che enumera in modo ricorsivo tutti gli elementi di un albero, a partire da un elemento radice passato alla funzione.
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;
}
La funzione accetta il parametro pWiaItem, un puntatore all'interfaccia IWiaItem (o IWiaItem2) dell'elemento radice dell'albero degli elementi da enumerare.
Prima di tutto, la funzione controlla se l'elemento è una cartella o se contiene allegati. In caso affermativo, chiama il metodo IWiaItem::EnumChildItems (o IWiaItem2::EnumChildItems) di pWiaItem per creare un oggetto enumeratore per l'albero degli elementi. Se la chiamata ha esito positivo e l'enumeratore è valido, la funzione scorre gli elementi figlio e chiama in modo ricorsivo su ogni elemento, trattandoli come un elemento radice potenziale per il livello successivo di elementi figlio.
In questo modo, la funzione enumera tutti i rami dell'albero degli elementi sotto l'elemento radice passato a EnumerateItems.