由于参数错误,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 出错 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

WINAPI VirtualQueryEx - 无效句柄

未创建对话框 WinAPI

如何防止我的函数在RemoveDirectory()WINAPI中延迟删除?

winapi GetProcessMemoryInfo 参数无效问题

错误 LNK2001:未解析的外部符号 WINAPI [重复]

具有字符串输出参数的 WinAPI 函数有多少一致性?