Pergunta

De acordo com a documentação MSDN, SetupDiGetClassDevs pode ser passado um dispositivo instância ID para obter um dispositivo conjunto de informações para um dispositivo específico:

Para retornar apenas um dispositivo específico, conjunto a bandeira DIFCF_DEVICEINTERFACE e uso o parâmetro Enumerator para suprir a dispositivo instância ID do dispositivo.

Eu obter o ID de instância do dispositivo ao analisar o nome simbólico do WM_DEVICECHANGE mensagem DBT_DEVICEARRIVAL evento e eu ter verificado a ID resultando, comparando-a que retornou de SetupDiGetDeviceInstanceId . Mesmo passando o OS fornecido exemplo Device ID não funciona (ou seja, a chamada SetupDiGetClassDevs falha com ERROR_INVALID_PARAMETER).

Minha solução atual para buscar um href="http://msdn.microsoft.com/en-us/library/ms792997.aspx" rel="noreferrer"> estrutura SP_DEVINFO_DATA para o recém-chegado dispositivo é para enumerar todos os dispositivos na mesma classe e comparar o resultado de SetupDiGetDeviceInstanceId para o nome simbólico. No entanto, não vejo por que isso deve ser necessário de acordo com a documentação ...

Alguém SetupDiGetClassDevs para trabalhar desta forma obtido? Existe um método melhor para obter mais informações para um dispositivo usando dados em caso DBT_DEVICEARRIVAL?

Foi útil?

Solução

Parece que você tem que especificar a bandeira DIGCF_ALLCLASSES para encontrar todas as classes que correspondem ao determinado ID de instância do dispositivo, ou então especificar o ClassGuid e usar a bandeira DIGCF_DEFAULT.

Isso funcionou para mim:

void error(DWORD err)
{
    WCHAR buf[0x200];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, 0x200, NULL);
    wprintf(L"%x: %s\n", err,  buf);
}


int _tmain(int argc, _TCHAR* argv[])
{
    PCWSTR devinst = L"HID\\VID_413C&PID_2105\\6&22CE0F66&0&0000";
    HDEVINFO hinfo = SetupDiGetClassDevs(NULL, devinst, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
    if (hinfo == INVALID_HANDLE_VALUE)
    {
        error(GetLastError());
        return 1;
    }

    SP_DEVINFO_DATA dinfo;
    dinfo.cbSize = sizeof(dinfo);
    int ix = 0;
    while (SetupDiEnumDeviceInfo(hinfo, ix++, &dinfo))
    {
        wprintf(L"Match\n");
    }

    error(GetLastError());

    SetupDiDestroyDeviceInfoList(hinfo);
    return 0;
}

Com saída:

Match
103: No more data is available.

Outras dicas

Parece que você está mal-entendido DBT_DEVICEARRIVAL.

Existem alguns tipos diferentes de DBT_DEVICEARRIVAL messages-- para um volume, por uma alça, para uma interface de dispositivo. Eu estou supondo que você está falando sobre a variedade DBT_DEVTYP_DEVICEINTERFACE. Neste caso, o campo dbcc_name da estrutura DEV_BROADCAST_DEVICEINTERFACE irá conter o "caminho interface do dispositivo".

O "dispositivo caminho de interface" não é o mesmo como um "dispositivo de exemplo ID".

Se você quiser saber mais informações sobre este dispositivo, você deve enumerar todos os dispositivos Interfaces por este dispositivo de interface GUID (através SetupDiGetClassDevs com DIGCF_DEVICEINTERFACE), e comparar o dbcc_name às cordas recuperadas por SetupDiEnumDeviceInterfaces.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top