列舉專案
建立裝置時,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;
}
函式會採用 pWiaItem參數,這是要列舉之專案樹狀目錄根專案的 IWiaItem (或 IWiaItem2) 介面。
首先,函式會檢查項目是否為資料夾,或是否有附件。 如果是,它會接著呼叫pWiaItem 的 IWiaItem::EnumChildItems (或IWiaItem2::EnumChildItems) 方法來建立專案樹狀結構的列舉值物件。 如果此呼叫成功,而且列舉值有效,函式會逐一查看子專案,並以遞迴方式在每個專案上呼叫本身,並將每個專案視為下一層子專案的潛在根專案。
如此一來,函式會列舉傳遞至 EnumerateItems之根專案下方專案樹狀結構的所有分支。