枚举项
创建设备时,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) 接口的指针)。
首先,函数检查项目是否为文件夹或是否具有附件。 如果存在,则调用 pWiaItem 的 IWiaItem::EnumChildItems (或 IWiaItem2::EnumChildItems) 方法为项树创建枚举器对象。 如果此调用成功,并且枚举器有效,则函数将循环访问子项,并递归地对每个项调用自身,将每个项视为下一级别的子项的潜在根项。
以这种方式,函数枚举传递到 EnumerateItems 的根项下的项树的所有分支。