Freigeben über


Auflisten von Systemgeräten

Verwenden Sie die IWiaDevMgr::EnumDeviceInfo-Methode (oder IWiaDevMgr2::EnumDeviceInfo), um die auf einem System installierten WIA-Geräte (Windows Image Acquisition) aufzulisten. Diese Methode erstellt ein Enumerationsobjekt für die Eigenschaften der Geräte und gibt einen Zeiger auf die IEnumWIA_DEV_INFO-Schnittstelle zurück, die vom Enumerationsobjekt unterstützt wird.

Anschließend können Sie die Methoden der IEnumWIA_DEV_INFO-Schnittstelle verwenden, um einen IWiaPropertyStorage-Schnittstellenzeiger für jedes auf dem System installierte Gerät abzurufen.

Der folgende Code aus der WiaSSamp-Beispielanwendung veranschaulicht, wie Sie ein Enumerationsobjekt für die Geräte in einem System erstellen und diese Geräte durchlaufen:

    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 ist eine WIA-Konstante, die den einzigen gültigen Wert für diesen Parameter darstellt.

Im Beispiel zeigt der Parameter pWiaDevMgr auf eine instance der IWiaDevMgr-Schnittstelle (oder IWiaDevMgr2) nach einem vorherigen Aufruf von CoCreateInstance.

Die Anwendung ruft die IWiaDevMgr::EnumDeviceInfo (oder IWiaDevMgr2::EnumDeviceInfo)-Methode des IWiaDevMgr (oder IWiaDevMgr2)-ZeigerspWiaDevMgr auf, der pWiaEnumDevInfo mit der Adresse eines Zeigers auf die IEnumWIA_DEV_INFO-Schnittstelle auffüllt.

Wenn der Aufruf erfolgreich ist, ruft die Anwendung die IEnumWIA_DEV_INFO::Reset-Methode des IEnumWIA_DEV_INFO-Zeigers auf. Die Variable pWiaEnumDevInfo stellt sicher, dass die Enumeration am Anfang beginnt.

Wenn dieser Aufruf erfolgreich ist, durchläuft die Anwendung die Geräte im System, indem die IEnumWIA_DEV_INFO::Next-Methode des IEnumWIA_DEV_INFO Zeigers pWiaEnumDevInfo wiederholt aufgerufen wird, bis die Methode nicht mehr S_OK zurückgibt, was angibt, dass die Enumeration abgeschlossen ist.

Jeder Aufruf von pWiaEnumDevInfo-Next füllt pWiaPropertyStorage mit einem Zeiger auf die IWiaPropertyStorage-Schnittstelle>, die Eigenschafteninformationen für ein bestimmtes Gerät enthält.