Перечисление системных устройств

Используйте метод 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, содержащий сведения о свойствах для определенного устройства.