use*_*622 4 windows usb winapi raw-input
我正在使用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);
...
...
Run Code Online (Sandbox Code Playgroud)
你没有做错任何事.
只需将第二个字符更改为\您即可.您看到的是原始形式的原始设备路径(\??\...).当你有\\?\一个拐杖的形式时,MS发明了尽管Win32子系统限制到\??对象目录,但当NT到达时,Win32上的长路径名可用.
请阅读Russinovich的"Windows Internals"章节(任何旧版本都会这样做),并使用Sysinternals的winobj.exe来探索Windows的对象命名空间,看看我在说什么.
旁注:当您调用CreateFile代码时,kernel32.dll将完全撤消建议的更改并将其转换回其本机形式,然后本机函数才能查看路径.所以你要做的就是让Win32层理解路径.