Compartilhar via


Enumerando dispositivos do sistema

Use o método IWiaDevMgr::EnumDeviceInfo (ou IWiaDevMgr2::EnumDeviceInfo) para enumerar os dispositivos WIA (Aquisição de Imagens do Windows) instalados em um sistema. Esse método cria um objeto de enumeração para as propriedades dos dispositivos e retorna um ponteiro para a interface IEnumWIA_DEV_INFO compatível com o objeto de enumeração.

Em seguida, você pode usar os métodos da interface IEnumWIA_DEV_INFO para obter um ponteiro de interface IWiaPropertyStorage para cada dispositivo instalado no sistema.

O código a seguir do aplicativo de exemplo WiaSSamp demonstra como criar um objeto de enumeração para os dispositivos em um sistema e iterar por meio desses 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 é uma constante WIA que representa o único valor válido para esse parâmetro.

No exemplo, o parâmetro pWiaDevMgr aponta para uma instância da interface IWiaDevMgr (ou IWiaDevMgr2) após uma chamada anterior para CoCreateInstance.

O aplicativo chama o método IWiaDevMgr::EnumDeviceInfo (ou IWiaDevMgr2::EnumDeviceInfo) do ponteiro IWiaDevMgr (ou IWiaDevMgr2) pWiaDevMgr que preenche pWiaEnumDevInfo com o endereço de um ponteiro para a interface IEnumWIA_DEV_INFO .

Se a chamada for bem-sucedida, o aplicativo chamará o método IEnumWIA_DEV_INFO::Reset do ponteiro IEnumWIA_DEV_INFO . A variável pWiaEnumDevInfo garante que a enumeração comece no início.

Se essa chamada for bem-sucedida, o aplicativo itera pelos dispositivos no sistema chamando repetidamente o método IEnumWIA_DEV_INFO::Next do ponteiro IEnumWIA_DEV_INFO pWiaEnumDevInfo até que o método não retorne mais S_OK, indicando que a enumeração está concluída.

Cada chamada para pWiaEnumDevInfo-Next> preenche pWiaPropertyStorage com um ponteiro para a interface IWiaPropertyStorage que contém informações de propriedade para um dispositivo específico.