2009-06-05 5 views
8

MSDN प्रलेखीकरण के अनुसार, SetupDiGetClassDevs एक device instance ID पारित किया जा सकता एक विशिष्ट उपकरण के लिए एक device information set प्राप्त करने के लिए:क्या SetupDiGetClassDevs डिवाइस इंस्टेंस आईडी के साथ दस्तावेज़ के रूप में काम करता है?

केवल एक विशिष्ट उपकरण लौटने के लिए, DIFCF_DEVICEINTERFACE ध्वज सेट और गणनाकार पैरामीटर का उपयोग आपूर्ति करने के लिए डिवाइस की डिवाइस इंस्टेंस आईडी।

मैं WM_DEVICECHANGE संदेश DBT_DEVICEARRIVAL घटना से प्रतीकात्मक नाम पार्स करने से डिवाइस उदाहरण आईडी मिलता है, और मुझे लगता है कि SetupDiGetDeviceInstanceId से लौटे तुलना करके जिसके परिणामस्वरूप आईडी सत्यापित किया है। यहां तक ​​कि ओएस आपूर्ति डिवाइस इत्यादि आईडी पास करने से भी काम नहीं होता है (यानी SetupDiGetClassDevs कॉल ERROR_INVALID_PARAMETER के साथ विफल रहता है)।

नए आने वाले डिवाइस के लिए SP_DEVINFO_DATA संरचना लाने के लिए मेरा वर्तमान कामकाज एक ही कक्षा में सभी उपकरणों का आकलन करना है और SetupDiGetDeviceInstanceId के प्रतीकात्मक नाम के परिणाम की तुलना करना है। हालांकि, मुझे नहीं लगता कि यह दस्तावेज़ीकरण के अनुसार क्यों जरूरी है ...

क्या किसी ने इस तरह से काम करने के लिए SetupDiGetClassDevs प्राप्त किया है? क्या DBT_DEVICEARRIVAL ईवेंट में डेटा का उपयोग कर डिवाइस के लिए और जानकारी प्राप्त करने के लिए कोई बेहतर तरीका है?

उत्तर

9

ऐसा लगता है कि आपको दिए गए डिवाइस आवृत्ति आईडी से मेल खाने वाले सभी वर्गों को खोजने के लिए DIGCF_ALLCLASSES ध्वज निर्दिष्ट करना है, या फिर क्लासगुइड निर्दिष्ट करें और 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. 
+0

DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES मेरे लिए गुम हिस्सा था। एमएसडीएन दस्तावेज से मुझे समझ में आया कि केवल DIGCF_DEVICEINTERFACE आवश्यक था, लेकिन इससे त्रुटि 87 (खराब तर्क) मिली। – angularsen

4

ऐसा लगता है कि आप DBT_DEVICEARRIVAL गलतफहमी कर रहे हैं।

डिवाइस इंटरफ़ेस के लिए, एक हैंडल के लिए, वॉल्यूम के लिए DBT_DEVICEARRIVAL संदेशों के कुछ अलग-अलग प्रकार हैं। मुझे लगता है कि आप DBT_DEVTYP_DEVICEINTERFACE विविधता के बारे में बात कर रहे हैं। इस मामले में, dbcc_nameDEV_BROADCAST_DEVICEINTERFACE संरचना के क्षेत्र में "डिवाइस इंटरफ़ेस पथ" होगा।

"डिवाइस इंटरफ़ेस पथ" "डिवाइस इंस्टेंस आईडी" जैसा नहीं है।

आप इस उपकरण के बारे में अधिक जानकारी जानना चाहते हैं, तो आप सभी डिवाइस इस डिवाइस इंटरफ़ेस GUID (DIGCF_DEVICEINTERFACE साथ SetupDiGetClassDevs के माध्यम से) इंटरफेस करके बताना चाहिए, और तार SetupDiEnumDeviceInterfaces के द्वारा प्राप्त करने के लिए dbcc_name की तुलना करें।

संबंधित मुद्दे