我正在使用USB RFID扫描仪并试图用raw input读取输入,到目前为止,我已经有了这个
#define _WIN32_WINNT 0x0601
#include <windows.h>
#include <stdio.h>
int main(void)
{
PRAWINPUTDEVICELIST pRawInputDeviceList;
PUINT puiNumDevices, pcbSize;
UINT cbSize = sizeof(RAWINPUTDEVICELIST);
char *pData[1000];
GetRawInputDeviceList(NULL, puiNumDevices, cbSize);
pRawInputDeviceList = malloc(cbSize * *puiNumDevices);
GetRawInputDeviceList(pRawInputDeviceList, puiNumDevices, cbSize);
// gives a correct RIM_TYPE for all devices 0-7 (GetRawInputDeviceList returns 8 devices for me)
printf("%I32u\n", pRawInputDeviceList[0].dwType);
GetRawInputDeviceInfo(pRawInputDeviceList[1].hDevice, RIDI_DEVICENAME, pData, pcbSize);
// gives a huge number (garbage?), should be the length of the name
printf("%u\n", pcbSize);
// "E" in my case
printf("%s\n", pData);
// error 87, apparently ERROR_INVALID_PARAMETER
printf("%I32u\n", GetLastError());
return 0;
}
答案 0 :(得分:1)
当您致电GetRawInputDeviceInfo
时,它希望pcbSize
成为指针。你有它作为指针,但它没有指向任何东西。试试这个:
pcbSize
(无处不在)。UINT cbDataSize = 1000
。这是pData
数组的大小。GetRawInputDeviceInfo
的最后一个参数,请使用&cbDataSize
。这需要cbDataSize
的地址,地址是指针。printf("%u\n", pcbSize);
更改为printf("%u\n", cbDataSize);
。了解这对您有何帮助。
[编辑]
另外,你应该对puiNumDevices
做同样的事情。而是创建一个名为UINT
的{{1}}。使用函数期望指针的uiNumDevices
。
答案 1 :(得分:0)
我将在这里走出困境,并猜测这件事实际上可能是一个HID设备。你知道吗?
HID设备实际上很容易交谈;你通过CreateFile()连接它们 - 就像你打开一个COM端口一样 - 然后只是ReadFile()来获取数据。
大多数问题是找出正确的连接路径。它实际上是一个名为DevicePath的值,您可以从SetupDiGetDeviceInterfaceDetail()获得。
它的粗略地图如下所示:
HidD_GetHidGuid()获取HID指导
SetupDiGetClassDevs()获取开发列表
通过开发人员循环,直到找到你的开头:
如果是,请记住它,并使用ReadFile()获取数据。