由于参数错误,WINAPI GetRawInputData 出错 [关闭]
Posted
技术标签:
【中文标题】由于参数错误,WINAPI GetRawInputData 出错 [关闭]【英文标题】:WINAPI GetRawInputData gives an error because of wrong parameters [closed] 【发布时间】:2021-09-15 16:52:34 【问题描述】:GetRawInputData()
返回 -1(错误),GetLastError()
返回 87,即“参数不正确。”,第一次调用该函数以获取数据大小成功,但第二次,我尝试实际获取数据,失败。
UINT DataSize;
if (GetRawInputData((HRAWINPUT)Message.lParam, RID_INPUT, NULL, &DataSize, sizeof(RAWINPUTHEADER)) == -1)
Error("Failed getting raw input amaount\n");
RAWINPUT *Raw;
Raw = (PRAWINPUT)VirtualAlloc(NULL, DataSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!Raw)
Error("Failed to allocate memory!\n");
if (GetRawInputData((HRAWINPUT)Message.lParam, RID_INPUT, Raw, &DataSize, sizeof(RAWINPUTHEADER) == -1)) // <-- Fails here
Error("Failed getting raw input\n");
【问题讨论】:
括号设置错误。 旁注:除非您正在编写分配器,否则您几乎没有理由需要在正常过程中调用VirtualAlloc
。
很遗憾,编译器没有警告sizeof(...) == -1
,如果没有别的,则用于有符号/无符号比较。在其他情况下,它肯定会发出警告。
【参考方案1】:
作为@dialer mentioned in a comment,在您第二次调用GetRawInputData()
时,右括号是错误的:
if (GetRawInputData(..., sizeof(RAWINPUTHEADER) == -1))
您将sizeof()
的结果与-1
进行比较,然后将该比较的结果(0 或1)传递给cbSizeHeader
参数(然后检查GetRawInputData()
是否返回非零值值),因此出现“无效参数”错误。
顺便说一句,GetRawInputDaata()
没有记录为使用GetLastError()
进行错误报告,因此当GetRawInputDaata()
返回-1
时,无论如何您都不能依赖该错误代码。
将您的 if
语句更改为像这样关闭:
if (GetRawInputData(..., sizeof(RAWINPUTHEADER)) == -1)
【讨论】:
以上是关于由于参数错误,WINAPI GetRawInputData 出错 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何防止我的函数在RemoveDirectory()WINAPI中延迟删除?
winapi GetProcessMemoryInfo 参数无效问题