我目前正在创建一个库来处理来自Raw Input API的信息,我正在使用级联函数处理所有内容。这导致了几个非常小的,非常易读且非常集中的功能。
但是,它刚刚打击我,我不明白如何正确表示Windows失败。我有这个功能:
/* OnInput: Handle data received from Windows via a `WM_INPUT` message. */
static LRESULT CALLBACK OnInput(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
BOOL DispatchRawInput(CONST PRAWINPUT);
assert(msg == WM_INPUT);
return DefWindowProc(hWnd, msg, wParam, lParam);
}
它返回零as the documentation states it should;但这取决于成功。
实际文字说明:
“如果应用程序处理此消息,则应返回零。”
但如果我无法处理它该怎么办?我最初假设你只是打电话给DefWindowProc
并将其留在那里,但这并没有向Windows发出任何事情的信号。
消息WM_CREATE
似乎是我能找到的唯一返回零以外的实例:
“如果应用程序处理此消息,则应返回零以继续创建窗口。如果应用程序返回-1,则窗口将被销毁,CreateWindowEx或CreateWindow函数将返回NULL句柄。”
错误处理真的只取决于程序员/团队而不是通知操作系统的必要性吗?那些失败并且需要阻止创建窗口的事件如WM_CREATE
呢?
答案 0 :(得分:3)
如果这是致命错误,那么您应该像处理其他致命错误一样处理它:以某种方式告知用户错误(MessageBox
,stderr
等)和{{1} }或exit()
。
如果这是一个非致命错误,那么你需要将它传回给你的应用程序,这可以通过多种方式完成:设置标志,调用函数,发布abort()
消息等。,并且您的应用程序应该处理它。总而言之,Windows并不在乎,并且您有责任以合理的方式处理错误。
如果您正在编写一个供他人使用的库,请确保您的应用程序具有明确定义和记录的错误过程。如果库中发生内部错误,则允许应用程序指定错误回调,然后调用该回调并让应用程序处理它。
答案 1 :(得分:1)
根据每条消息的文档指出错误。如果消息没有说明错误,那么您可以安全地假设该消息没有错误指示符。这对于通知消息很常见,操作系统只是告诉您发生了某些事情。它不需要您的回复。