Share via


列舉系統裝置

使用 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介面的指標位址填入pWiaEnumDevInfo

如果呼叫成功,應用程式接著會呼叫IEnumWIA_DEV_INFO指標的IEnumWIA_DEV_INFO::Reset方法。 pWiaEnumDevInfo變數可確保列舉從開頭開始。

如果此呼叫成功,應用程式會重複呼叫系統上的裝置,方法是重複呼叫IEnumWIA_DEV_INFO指標pWiaEnumDevInfoIEnumWIA_DEV_INFO::Next方法,直到方法不再傳回S_OK為止,表示列舉已完成。

每個對 pWiaEnumDevInfo-Next >的呼叫都會使用IWiaPropertyStorage 介面的指標填入 pWiaPropertyStorage,其中包含特定裝置的屬性資訊。