枚举系统设备

使用 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 指向上一次调用 CoCreateInstance 后) 接口的 IWiaDevMgr (或 IWiaDevMgr2 实例。

应用程序调用 IWiaDevMgr::EnumDeviceInfo (或 IWiaDevMgr2::EnumDeviceInfo) 方法的 IWiaDevMgr (或 IWiaDevMgr2) 指针 pWiaDevMgr,该指针使用指向 IEnumWIA_DEV_INFO 接口的指针地址填充 pWiaDevMgr

如果调用成功,应用程序将调用IEnumWIA_DEV_INFO指针的 IEnumWIA_DEV_INFO::Reset 方法。 pWiaEnumDevInfo 变量可确保枚举从开头开始。

如果此调用成功,应用程序将通过重复调用IEnumWIA_DEV_INFO指针 pWiaEnumDevInfo的 IEnumWIA_DEV_INFO::Next 方法循环访问系统上的设备,直到该方法不再返回S_OK,指示枚举已完成。

每次调用 pWiaEnumDevInfo-Next> 都会使用指向包含特定设备属性信息的 IWiaPropertyStorage 接口的指针填充 pWiaPropertyStorage