setUpDigetDeviceInterFaceDetailは、すべてのUSB HIDオブジェクトのパスに対して「」のみを返します
質問
私が持っているUSB HIDデバイス(7)の数を知ることができますが、どのデバイスでも詳細を取得しようとするたびに、返されるパスは常に「」であり、デバイスにまったくアクセスできないようにします。このコードと手順が非常に似ているコードを使用しています。
HANDLE connectDeviceNumber(DWORD deviceIndex)
{
GUID hidGUID;
HDEVINFO hardwareDeviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
ULONG requiredSize;
HANDLE deviceHandle = INVALID_HANDLE_VALUE;
DWORD result;
//Get the HID GUID value - used as mask to get list of devices
HidD_GetHidGuid (&hidGUID);
//Get a list of devices matching the criteria (hid interface, present)
hardwareDeviceInfoSet = SetupDiGetClassDevs (&hidGUID,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_DEVICEINTERFACE)); // Function class devices.
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
//Go through the list and get the interface data
result = SetupDiEnumDeviceInterfaces (hardwareDeviceInfoSet,
NULL, //infoData,
&hidGUID, //interfaceClassGuid,
deviceIndex,
&deviceInterfaceData);
/* Failed to get a device - possibly the index is larger than the number of devices */
if (result == FALSE)
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
Log("hidin: -- failed to get specified device number");
return INVALID_HANDLE_VALUE;
}
//Get the details with null values to get the required size of the buffer
SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,
NULL, //interfaceDetail,
0, //interfaceDetailSize,
&requiredSize,
0); //infoData))
//Allocate the buffer
deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
//Fill the buffer with the device details
if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,
deviceDetail,
requiredSize,
&requiredSize,
NULL))
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
free (deviceDetail);
Log("hidin: -- failed to get device info");
return INVALID_HANDLE_VALUE;
}
Log("Opening device with path: %s", deviceDetail->DevicePath);
解決
確かに、あなたは定義されたUnicodeをコンパイルしていますか?次に、文字列のフォーマットが間違っています。修理:
Log("Opening device with path: %ls", deviceDetail->DevicePath);
他のヒント
のドキュメント SetupDiEnumDeviceInterfaces
最初にdeviceindex == 0で呼び出す必要があると述べています。値をスキップすることは想定されていません。
所属していません StackOverflow