4

GetRawInputDeviceInfo用来获取 USB HID 设备名称的设备名称。

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

这当然意味着,当我尝试使用此设备名称时(CreateFile例如“它不起作用。如果我编辑设备名称并手动修复它以使\\?\一切正常。

这在 Windows 7 中不会发生。在 Win7 中一切正常。

GetLastError我还在每次 API 调用后进行测试,并且没有发生错误。

我所有的操作系​​统都是 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);
...

...
4

1 回答 1

6

你没有做错任何事。

只需将第二个字符更改为即可\。您看到的是原生形式的原始设备路径 ( \??\...)。当您拥有\\?\作为拐杖 MS 发明的表单时,尽管 Win32 子系统对\??对象目录的限制,但当 NT 到达时,它可以在 Win32 上提供长路径名。

请阅读 Russinovich 的“Windows Internals”的几章(任何旧版本都可以)并使用 Sysinternals 的 winobj.exe 来探索 Windows 的对象命名空间,看看我在说什么。

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

于 2012-05-29T13:00:25.947 回答