处理 WinAPI 错误 return 值

Handling WinAPI error return values

我目前正在学习与 WinAPI 相关的 C++。我正在努力为 WinAPI 函数提出有意义的错误处理策略。

问题:

大多数 WinAPI 函数在出错时可以 return 0,但在许多情况下,我在 MSDN 上看不到任何关于可能导致此类错误的原因以及如何解决/解决它的信息。以GetCursorPos为例:

Returns nonzero if successful or zero otherwise. To get extended error information, call GetLastError.

(...)

The input desktop must be the current desktop when you call GetCursorPos. Call OpenInputDesktop to determine whether the current desktop is the input desktop. If it is not, call SetThreadDesktop with the HDESK returned by OpenInputDesktop to switch to that desktop.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

总结一下: WinAPI 中的几乎每个函数都可以 return 确定错误发生的值,我可以获得有关错误的信息 当它发生 使用 GetLastError 函数。但是没有任何关于我可以预期的错误类型以及解决这些错误的步骤的信息。

示例很多,GetWindowRect 也被广泛使用,MSDN 提供的信息与 GetCursorPos 一样有限。

问题:

请问是否有关于如何处理 WinAPI 函数错误 return 值的任何标准,这些值将保留错误处理,使其不再只是显示消息框并退出应用程序?谢谢!

就提前了解特定函数可能 return 编辑哪些可能的错误代码而言,恐怕微软很久以前就决定为所有函数维护此类文档太麻烦了而且代价高昂,因为 API 函数可能会调用任意数量的其他 API 函数,而这些函数又可能会调用其他函数,依此类推。有时你很幸运,MSDN 文档会调出特定于该函数的错误代码,ReadFile 就是这种情况,但正如你所注意到的,并非所有函数都是这种情况。

也就是说,处理由 GetLastError() 编辑的错误代码 return 的标准方法是 format them with FormatMessage

如果您为 lang ID 传递了 LANG_USER_DEFAULT,这将 return 根据错误代码以用户选择的语言环境格式化有时有用、有时不太有用的错误消息。您可以向用户显示此消息。如果您想将其格式化为您自己的语言以进行日志记录,假设它是英语,您将传递 MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 作为 lang ID。

如果没有记录错误代码并且您没有在测试中遇到它们,这是您可以做的最好的事情:记录它们并获取日志以及附加到问题报告的其他调试信息。