2009-06-05 26 views
8

Theo tài liệu MSDN, SetupDiGetClassDevs thể được thông qua một device instance ID để có được một device information set cho một thiết bị cụ thể:Thiết lập SetupDiGetClassDev có hoạt động với các ID cá thể thiết bị như được ghi lại không?

Để trở về chỉ là một thiết bị cụ thể, thiết cờ DIFCF_DEVICEINTERFACE và sử dụng tham số Enumerator để cung cấp ID cá thể thiết bị của thiết bị.

tôi nhận được ID dụ thiết bị bằng cách phân tích các tên mang tính biểu tượng từ DBT_DEVICEARRIVAL kiện WM_DEVICECHANGE tin nhắn, và tôi đã xác minh ID kết quả bằng cách so sánh nó với trở về từ SetupDiGetDeviceInstanceId. Ngay cả khi truyền ID cá thể thiết bị do OS cung cấp không hoạt động (tức là cuộc gọi SetupDiGetClassDevs không thành công với ERROR_INVALID_PARAMETER).

Cách giải quyết hiện tại của tôi để tìm cấu trúc SP_DEVINFO_DATA cho thiết bị mới đến là liệt kê tất cả các thiết bị trong cùng một lớp và so sánh kết quả của SetupDiGetDeviceInstanceId với tên biểu tượng. Tuy nhiên, tôi không thấy lý do tại sao điều này cần thiết theo tài liệu ...

Có ai đã thiết lập SetupDiGetClassDevs để hoạt động theo cách này không? Có phương pháp nào tốt hơn để nhận thêm thông tin cho thiết bị sử dụng dữ liệu trong sự kiện DBT_DEVICEARRIVAL không?

Trả lời

9

Có vẻ như bạn phải chỉ định cờ DIGCF_ALLCLASSES để tìm tất cả các lớp khớp với id cá thể thiết bị đã cho hoặc chỉ định ClassGuid và sử dụng cờ DIGCF_DEFAULT.

này đã làm việc cho tôi:

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; 
} 

Với đầu ra:

Match 
103: No more data is available. 
+0

DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES là phần còn thiếu của tôi. Từ tài liệu MSDN tôi đã hiểu rằng chỉ có DIGCF_DEVICEINTERFACE là cần thiết, nhưng điều đó đã gây ra lỗi 87 (đối số xấu). – angularsen

4

Có vẻ như bạn đang hiểu lầm DBT_DEVICEARRIVAL.

Có một vài loại khác nhau của DBT_DEVICEARRIVAL tin nhắn-- cho một khối lượng, để xử lý, cho giao diện thiết bị. Tôi đoán bạn đang nói về giống DBT_DEVTYP_DEVICEINTERFACE. Trong trường hợp này, trường dbcc_name của cấu trúc DEV_BROADCAST_DEVICEINTERFACE sẽ chứa "đường dẫn giao diện thiết bị".

"Đường dẫn giao diện thiết bị" KHÔNG giống với "ID cá thể thiết bị".

Nếu bạn muốn biết thêm thông tin về thiết bị này, bạn nên liệt kê tất cả thiết bị giao diện của thành viên này GUID giao diện thiết bị (thông qua SetupDiGetClassDevs với DIGCF_DEVICEINTERFACE), và so sánh các dbcc_name đến chuỗi lấy ra bởi SetupDiEnumDeviceInterfaces.

Các vấn đề liên quan