gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:58:50 25 4
gpt4 key购买 nike

我正在使用 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);
...

...

最佳答案

你没有做错什么。

只需将第二个字符更改为 \ 即可。您看到的是原始格式的原始设备路径 (\??\...)。当你有 \\?\ 的形式时,它是 MS 发明的一个拐杖,当 NT 出现时,尽管 Win32 子系统对 \?? 对象目录。

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

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

关于windows - GetRawInputDeviceInfo 在 Windows XP 中返回错误的 USB HID 设备名称语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com