هل يعمل SetupDigeGetClassDevs مع معرفات مثيل الجهاز كما هو موثق؟
-
12-09-2019 - |
سؤال
وفقا لتوثيق MSDN، setupdigetclassdevs. يمكن أن تمر الرقم التعريفي الخاص بالجهاز للحصول على أ مجموعة معلومات الجهاز لجهاز معين:
لإرجاع جهاز معين فقط، قم بتعيين علامة difcf_deviceInterface واستخدم المعلمة العداد لتزويد معرف مثيل الجهاز للجهاز.
أحصل على معرف مثيل الجهاز عن طريق تحليل الاسم الرمزي من WM_DEVICECHANGE
رسالة DBT_DEVICEARRIVAL
حدث، وقد تحققت معرف الناتج عن طريق مقارنة ذلك الذي عاد من setupdigetdeviceinstanst.. وبعد حتى الآن لا يعمل معرف مثيل نظام نظام التشغيل (أي فشل دعوة SetupDigeGetClassDevs ERROR_INVALID_PARAMETER
).
الحل الحالي لي لجلب SP_DEVINFO_DATA
هيكل الجهاز الواحد حديثا هو تعداد جميع الأجهزة في نفس الفصل ومقارنة نتيجة SetupDigetDeviceInstance على الاسم الرمزي. ومع ذلك، لا أرى لماذا يجب أن يكون ذلك ضروريا وفقا للوثائق ...
هل حصل أي شخص على setupdigetclassdevs للعمل بهذه الطريقة؟ هل هناك طريقة أفضل للحصول على مزيد من المعلومات لجهاز باستخدام البيانات في حدث DBT_Devicearival؟
المحلول
يبدو أن عليك إما تحديد DIGCF_ALLCLASSES
علم للعثور على جميع الطبقات التي تطابق معرف مثيل الجهاز معين، أو حدد آخر classguid واستخدام DIGCF_DEFAULT
علم.
هذا عملت بالنسبة لي:
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;
}
مع الإخراج:
Match
103: No more data is available.
نصائح أخرى
يبدو أنك سوء فهم DBT_DEVICEARRIVAL
.
هناك بعض أنواع مختلفة من DBT_DEVICEARRIVAL
الرسائل - للحصول على وحدة تخزين، للمقبض، لواجهة الجهاز. أنا أظن أنك تتحدث عن مجموعة DBT_DEVTYP_DEVICEIRTFACE. في هذه الحالة، dbcc_name
مجال. DEV_BROADCAST_DEVICEINTERFACE
سوف تحتوي الهيكل على "مسار واجهة الجهاز".
"مسار واجهة الجهاز" ليس هو نفسه "معرف مثيل الجهاز".
إذا كنت تريد معرفة المزيد من المعلومات حول هذا الجهاز، يجب عليك تعداد كل الأجهزة واجهات بواسطة واجهة الجهاز هذه GUID (من خلال SetupDigetClassDevs مع DIGCF_DEVICEIRTFACE)، ومقارنة DBCC_NAME إلى السلاسل التي تم استرجها بواسطة SetupDiEnumDeviceInterfaces
.