هل يعمل SetupDigeGetClassDevs مع معرفات مثيل الجهاز كما هو موثق؟

StackOverflow https://stackoverflow.com/questions/956669

سؤال

وفقا لتوثيق 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top