Compartir a través de


Enumeración de dispositivos del sistema

Use el método IWiaDevMgr::EnumDeviceInfo (o IWiaDevMgr2::EnumDeviceInfo) para enumerar los dispositivos windows Image Acquisition (WIA) instalados en un sistema. Este método crea un objeto de enumeración para las propiedades de los dispositivos y devuelve un puntero a la interfaz IEnumWIA_DEV_INFO que admite el objeto de enumeración.

A continuación, puede usar los métodos de la interfaz IEnumWIA_DEV_INFO para obtener un puntero de interfaz IWiaPropertyStorage para cada dispositivo instalado en el sistema.

El código siguiente de la aplicación de ejemplo WiaSSamp muestra cómo crear un objeto de enumeración para los dispositivos de un sistema y recorrer en iteración esos dispositivos:

    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 es una constante WIA que representa el único valor válido para este parámetro.

En el ejemplo, el parámetro pWiaDevMgr apunta a una instancia de la interfaz IWiaDevMgr (o IWiaDevMgr2) después de una llamada anterior a CoCreateInstance.

La aplicación llama al método IWiaDevMgr::EnumDeviceInfo (o IWiaDevMgr2::EnumDeviceInfo) del puntero IWiaDevMgr (o IWiaDevMgr2) pWiaDevMgr que rellena pWiaEnumDevInfo con la dirección de un puntero a la interfaz IEnumWIA_DEV_INFO .

Si la llamada se realiza correctamente, la aplicación llama al método IEnumWIA_DEV_INFO::Reset del puntero IEnumWIA_DEV_INFO . La variable pWiaEnumDevInfo garantiza que la enumeración se inicia al principio.

Si esta llamada se realiza correctamente, la aplicación recorre en iteración los dispositivos del sistema llamando repetidamente al método IEnumWIA_DEV_INFO::Next del puntero de IEnumWIA_DEV_INFOpWiaEnumDevInfo hasta que el método ya no devuelve S_OK, lo que indica que la enumeración está completa.

Cada llamada a pWiaEnumDevInfo-Next> rellena pWiaPropertyStorage con un puntero a la interfaz IWiaPropertyStorage que contiene información de propiedad para un dispositivo específico.