Partager via


Énumération des appareils système

Utilisez la méthode IWiaDevMgr::EnumDeviceInfo (ou IWiaDevMgr2::EnumDeviceInfo) pour énumérer les appareils WIA (Windows Image Acquisition) installés sur un système. Cette méthode crée un objet d’énumération pour les propriétés des appareils et retourne un pointeur vers l’interface IEnumWIA_DEV_INFO prise en charge par l’objet d’énumération.

Vous pouvez ensuite utiliser les méthodes de l’interface IEnumWIA_DEV_INFO pour obtenir un pointeur d’interface IWiaPropertyStorage pour chaque appareil installé sur le système.

Le code suivant de l’exemple d’application WiaSSamp montre comment créer un objet d’énumération pour les appareils sur un système et effectuer une itération au sein de ces appareils :

    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 est une constante WIA qui représente la seule valeur valide pour ce paramètre.

Dans l’exemple, le paramètre pWiaDevMgr pointe vers un instance de l’interface IWiaDevMgr (ou IWiaDevMgr2) après un appel précédent à CoCreateInstance.

L’application appelle la méthode IWiaDevMgr::EnumDeviceInfo (ou IWiaDevMgr2::EnumDeviceInfo) du pointeur IWiaDevMgr (ou IWiaDevMgr2) pWiaDevMgr qui remplit pWiaEnumDevInfo avec l’adresse d’un pointeur vers l’interface IEnumWIA_DEV_INFO .

Si l’appel réussit, l’application appelle la méthode IEnumWIA_DEV_INFO::Reset du pointeur IEnumWIA_DEV_INFO . La variable pWiaEnumDevInfo garantit que l’énumération commence au début.

Si cet appel réussit, l’application effectue une itération au sein des appareils sur le système en appelant à plusieurs reprises la méthode IEnumWIA_DEV_INFO::Next du pointeur IEnumWIA_DEV_INFO pWiaEnumDevInfo jusqu’à ce que la méthode ne retourne plus S_OK, indiquant que l’énumération est terminée.

Chaque appel à pWiaEnumDevInfo-Next> remplit pWiaPropertyStorage avec un pointeur vers l’interface IWiaPropertyStorage qui contient des informations de propriété pour un appareil spécifique.