GetRawInputDeviceInfo在Windows XP中返回错误的USB HID设备名称语法

时间:2012-05-29 12:04:41

标签: windows winapi usb raw-input

我正在使用GetRawInputDeviceInfo获取USB HID设备名称的设备名称。

出于某种原因,当我在Windows XP下运行我的代码时,我得到的设备名称以\??\而不是\\?\开头。

这当然意味着,当我尝试使用此设备名称时(例如在CreateFile中)它不起作用。如果我编辑设备名称并手动将其修复为\\?\一切效果很好。

在Windows 7中不会发生这种情况。在Win7中,一切都很好。

我还会在每次API调用后测试GetLastError,并且不会发生错误。

我的所有操作系统都是32位,我的项目正在使用unicode进行编译。

有什么建议我做错了什么?这是我的控制台应用程序中的代码片段,它获取设备名称。

nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, NULL, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name character count.." << endl;
return false;
}
WCHAR* wcDeviceName = new WCHAR[ nBufferSize + 1 ];
if( wcDeviceName == NULL )
{
cout << "ERR: Unable to allocate memory for Device Name.." << endl;
return false;
}
nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, wcDeviceName, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name.." << endl;
delete [] wcDeviceName;
return false;
}
wcDeviceName[1]='\\';
//This is the manual fix for the device name in WinXP. How do I get rid of it????
pDesc->hHandle = CreateFile(wcDeviceName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
...

...

1 个答案:

答案 0 :(得分:6)

你没有做错任何事。

只需将第二个字符更改为\即可。您看到的是原始设备路径(\??\...)。当你有一个形式\\?\时,虽然Win32子系统限制在\??对象目录,但是当NT到达时,MS发明了在MS32上提供长路径名称。

请阅读&#34; Windows Internals&#34;的几个章节。通过Russinovich(任何旧版本都可以)并使用来自Sysinternals的winobj.exe来探索Windows的对象命名空间,看看我在说什么。

旁注:当您调用CreateFile时,kernel32.dll中的代码将逐字撤消建议的更改,并在本机函数查看路径之前将其转换回其本机形式。所以你要做的就是让Win32层理解路径。