Перечисление системных устройств
Используйте метод IWiaDevMgr::EnumDeviceInfo (или IWiaDevMgr2::EnumDeviceInfo) для перечисления устройств получения образов Windows (WIA), установленных в системе. Этот метод создает объект перечисления для свойств устройств и возвращает указатель на интерфейс IEnumWIA_DEV_INFO , поддерживаемый объектом перечисления.
Затем можно использовать методы интерфейса IEnumWIA_DEV_INFO , чтобы получить указатель интерфейса IWiaPropertyStorage для каждого устройства, установленного в системе.
В следующем коде из примера приложения WiaSSamp показано, как создать объект перечисления для устройств в системе и выполнить итерацию по этим устройствам:
HRESULT EnumerateWiaDevices( IWiaDevMgr *pWiaDevMgr ) //XP or earlier
HRESULT EnumerateWiaDevices( IWiaDevMgr2 *pWiaDevMgr ) //Vista or later
{
//
// Validate arguments
//
if (NULL == pWiaDevMgr)
{
return E_INVALIDARG;
}
//
// Get a device enumerator interface
//
IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL;
HRESULT hr = pWiaDevMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_LOCAL, &pWiaEnumDevInfo );
if (SUCCEEDED(hr))
{
//
// Loop until you get an error or pWiaEnumDevInfo->Next returns
// S_FALSE to signal the end of the list.
//
while (S_OK == hr)
{
//
// Get the next device's property storage interface pointer
//
IWiaPropertyStorage *pWiaPropertyStorage = NULL;
hr = pWiaEnumDevInfo->Next( 1, &pWiaPropertyStorage, NULL );
//
// pWiaEnumDevInfo->Next will return S_FALSE when the list is
// exhausted, so check for S_OK before using the returned
// value.
//
if (hr == S_OK)
{
//
// Do something with the device's IWiaPropertyStorage*
//
//
// Release the device's IWiaPropertyStorage*
//
pWiaPropertyStorage->Release();
pWiaPropertyStorage = 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
//
pWiaEnumDevInfo->Release();
pWiaEnumDevInfo = NULL;
}
//
// Return the result of the enumeration
//
return hr;
}
WIA_DEVINFO_ENUM_LOCAL является константой WIA, представляющей единственно допустимое значение для этого параметра.
В этом примере параметр pWiaDevMgr указывает на экземпляр интерфейса IWiaDevMgr (или IWiaDevMgr2) после предыдущего вызова CoCreateInstance.
Приложение вызывает метод IWiaDevMgr::EnumDeviceInfo (или IWiaDevMgr2::EnumDeviceInfo) указателя IWiaDevMgr (или IWiaDevMgr2), который заполняет pWiaEnumDevInfo адресом указателя на интерфейс IEnumWIA_DEV_INFO.
В случае успешного вызова приложение вызывает метод IEnumWIA_DEV_INFO::Reset указателя IEnumWIA_DEV_INFO . Переменная pWiaEnumDevInfo гарантирует, что перечисление начинается с начала.
Если этот вызов выполнен успешно, приложение выполняет итерацию по устройствам в системе, многократно вызывая метод IEnumWIA_DEV_INFO::Next указателя IEnumWIA_DEV_INFOpWiaEnumDevInfo , пока метод не возвращает S_OK, указывая, что перечисление завершено.
Каждый вызов pWiaEnumDevInfo-Next> заполняет pWiaPropertyStorage указателем на интерфейс IWiaPropertyStorage, содержащий сведения о свойствах для определенного устройства.