2

我目前正在编写一个库来处理来自原始输入 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);
}

并且它返回零,因为文档说明它应该;但这假设成功。

实际文本指出:

“如果应用程序处理此消息,它应该返回零。”

但是,如果我不能处理它,我该怎么办?我最初以为您只是打电话DefWindowProc并保留它,但这并没有向 Windows 发出任何发生的信号。

该消息WM_CREATE似乎是我能找到的唯一一个返回非零值的实例:

“如果应用程序处理此消息,它应该返回零以继续创建窗口。如果应用程序返回 –1,则窗口被销毁并且 CreateWindowEx 或 CreateWindow 函数返回一个 NULL 句柄。”

错误处理真的只取决于程序员/团队,而不是通知操作系统的必要条件吗?像WM_CREATE这样的事件失败并需要阻止创建窗口怎么办?

4

2 回答 2

3

如果这是一个致命错误,那么您应该像处理其他致命错误一样处理它:以某种方式通知用户该错误(MessageBox,stderr等)和exit()or abort()

如果这是一个非致命错误,那么您需要将其传达回您的应用程序,这可以通过多种方式完成:设置标志、调用函数、发布WM_APP消息等,您的应用程序应该处理它. 总而言之,Windows 并不关心,您有责任以合理的方式处理错误。

如果您正在编写一个供他人使用的库,请确保您的应用程序具有明确定义和记录的错误过程。如果您的库中发生内部错误,则允许应用程序指定错误回调,然后调用该回调并让应用程序处理它。

于 2013-08-28T20:42:28.920 回答
1

您根据每条消息的文档指示错误。如果消息没有说明任何错误,那么您可以放心地假设该消息没有错误指示符。这对于通知消息很常见,操作系统只是告诉您发生了什么事。它不需要你的回应。

于 2013-08-28T20:36:15.893 回答