Compartilhar via


Enumerando itens

Quando um dispositivo é criado, a WIA (Aquisição de Imagens do Windows) cria uma árvore hierárquica de itens WIA que representam o dispositivo e as pastas e imagens associadas a esse dispositivo. Use o método do item raiz (o item na raiz da árvore que representa o dispositivo) IWiaItem::EnumChildItems (ou método IWiaItem2::EnumChildItems) para criar um objeto enumerador e obter um ponteiro para sua interface IEnumWiaItem (ou IEnumWiaItem2), que é usada para navegar na árvore de itens e obter acesso às imagens ou aos leitos de verificação associados ao dispositivo.

O exemplo a seguir mostra uma função que enumera recursivamente todos os itens de uma árvore, começando com um item raiz que é passado para a função.

    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;
    }

A função usa o parâmetro pWiaItem, um ponteiro para a interface IWiaItem (ou IWiaItem2) do item raiz da árvore de itens para enumerar.

Primeiro, a função verifica se o item é uma pasta ou se tem anexos. Se isso acontecer, ele chamará o método IWiaItem::EnumChildItems (ou IWiaItem2::EnumChildItems) de pWiaItem para criar um objeto enumerador para a árvore de itens. Se essa chamada for bem-sucedida e o enumerador for válido, a função itera pelos itens filho e se chama recursivamente em cada item, tratando cada um como um item raiz potencial para o próximo nível de itens filho.

Dessa forma, a função enumera todos os branches da árvore de itens abaixo do item raiz passado para EnumerateItems.