항목 열거

디바이스를 만들 때 WIA(Windows Image Acquisition)는 디바이스와 해당 디바이스와 연결된 폴더 및 이미지를 나타내는 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;
    }

함수는 열거할 항목 트리의 루트 항목에 대한 IWiaItem(또는 IWiaItem2) 인터페이스에 대한 포인터인 pWiaItem 매개 변수를 사용합니다.

먼저 함수는 항목이 폴더인지 또는 첨부 파일이 있는지 확인합니다. 이 경우 pWiaItem의 IWiaItem::EnumChildItems(또는 IWiaItem2::EnumChildItems) 메서드를 호출하여 항목 트리에 대한 열거자 개체를 만듭니다. 이 호출이 성공하고 열거자가 유효한 경우 함수는 자식 항목을 반복하고 각 항목에서 자신을 재귀적으로 호출하여 각 항목을 다음 수준의 자식 항목에 대한 잠재적 루트 항목으로 처리합니다.

이러한 방식으로 함수는 EnumerateItems에 전달된 루트 항목 아래에 있는 항목 트리의 모든 분기를 열거합니다.