次の方法で共有


システム デバイスの列挙

システムにインストールされている Windows イメージ取得 (WIA) デバイスを列挙するには、IWiaDevMgr::EnumDeviceInfo (または IWiaDevMgr2::EnumDeviceInfo) メソッドを使用します。 このメソッドは、デバイスのプロパティの列挙オブジェクトを作成し、列挙オブジェクトがサポートする 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) インターフェイスのインスタンスを指しています。

アプリケーションは、pWiaEnumDevInfoIEnumWIA_DEV_INFO インターフェイスへのポインターのアドレスを入力する IWiaDevMgr (または IWiaDevMgr2) ポインター pWiaDevMgr の IWiaDevMgr::EnumDeviceInfo (または IWiaDevMgr2::EnumDeviceInfo) メソッドを呼び出します。

呼び出しが成功した場合、アプリケーションはIEnumWIA_DEV_INFO ポインターのIEnumWIA_DEV_INFO::Reset メソッドを呼び出します。 pWiaEnumDevInfo 変数を使用すると、列挙が先頭から開始されます。

この呼び出しが成功した場合、アプリケーションは、IEnumWIA_DEV_INFO ポインターpWiaEnumDevInfoIEnumWIA_DEV_INFO::Next メソッドを繰り返し呼び出して、メソッドがS_OKを返さなくなるまで繰り返し呼び出し、列挙が完了したことを示します。

pWiaEnumDevInfo-Next> の各呼び出しは、特定のデバイスのプロパティ情報を含む IWiaPropertyStorage インターフェイスへのポインターで pWiaPropertyStorage を埋めます。