我正在使用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);
...
...
答案 0 :(得分:6)
你没有做错任何事。
只需将第二个字符更改为\
即可。您看到的是原始设备路径(\??\...
)。当你有一个形式\\?\
时,虽然Win32子系统限制在\??
对象目录,但是当NT到达时,MS发明了在MS32上提供长路径名称。
请阅读&#34; Windows Internals&#34;的几个章节。通过Russinovich(任何旧版本都可以)并使用来自Sysinternals的winobj.exe来探索Windows的对象命名空间,看看我在说什么。
旁注:当您调用CreateFile
时,kernel32.dll
中的代码将逐字撤消建议的更改,并在本机函数查看路径之前将其转换回其本机形式。所以你要做的就是让Win32层理解路径。