0

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

问题:

大多数 WinAPI 函数在出现错误时都可以返回 0,但在许多情况下,我在 MSDN 上看不到任何关于什么可能导致此类错误以及如何解决/解决它的信息。举GetCursorPos个例子:

如果成功则返回非零,否则返回零。要获取扩展的错误信息,请调用GetLastError

(...)

调用GetCursorPos时,输入桌面必须是当前桌面。调用OpenInputDesktop判断当前桌面是否为输入桌面。如果不是,请使用返回的HDESK调用SetThreadDesktop桌面。

  • 如果我遵循GetLastError的路线的路线,我会对该特定函数可能返回哪些错误感兴趣,以便我可以检查可以对它们做些什么。但是错误代码在这个MSDN 页面上被组织成 10 组,仅基于错误编号,而没有任何说明在哪个组中列出了哪些错误。
  • 当我试图发现OpenInputDesktop将如何如何帮助我使我的代码更加防弹时,我再次发现:

如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用GetLastError

总结一下: WinAPI中的几乎每个函数都可以返回确定错误发生的值,并且我可以在错误发生时获取有关错误的信息GetLastError。但是没有任何关于我可以预期什么样的错误以及解决这些错误的步骤的信息。

例子很多,GetWindowRect也被广泛使用和MSDN提供的信息与GetCursorPos.

问题:

请问有没有关于如何处理 WinAPI 函数错误返回值的标准,这些标准将保留错误处理,而不是仅仅显示一个消息框并退出应用程序?谢谢!

4

1 回答 1

2

至于提前知道特定函数可以返回哪些可能的错误代码,恐怕微软很久以前就决定为所有函数维护此类文档会太麻烦且成本高昂,因为 API 函数可能会调用任何其他 API 函数的数量,这些函数又可能调用其他函数,依此类推。有时你很幸运,MSDN 文档会调用特定于该函数的错误代码,就像ReadFile的情况一样,但并非所有函数都如此。

话虽如此,处理返回的错误代码的标准方法是使用 FormatMessage 对其GetLastError()进行格式化。

如果您为语言 ID 传递了 LANG_USER_DEFAULT,这将返回有时有用,有时不是那么有用的错误消息,该错误消息以用户选择的语言环境从错误代码中格式化。您可以向用户显示此消息。如果您想将其格式化为您自己的语言以用于记录目的,假设它是英语,您将传递 MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 作为语言 ID。

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

于 2017-10-21T21:08:36.963 回答