处理WinAPI错误返回值

时间:2017-10-21 19:09:04

标签: c++ winapi error-handling standards getlasterror

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

问题:

如果出现错误,大多数WinAPI函数都可以返回0,但在很多情况下,我没有在MSDN上看到有关可能导致此类错误的原因以及如何解决/解决它的任何信息。以GetCursorPos为例:

  

如果成功则返回非零值,否则返回零。要获取扩展错误信息,请致电 GetLastError

     

(...)

     

当您致电 GetCursorPos 时,输入桌面必须是当前桌面。致电 OpenInputDesktop 以确定当前桌面是否为输入桌面。如果不是,请使用 OpenInputDesktop 返回的 HDESK 拨打 SetThreadDesktop 切换到该桌面。

  • 如果我遵循 GetLastError 的路线,我感兴趣的是该特定功能可以返回哪些错误,以便我可以检查可以对它们做些什么。但错误代码在此MSDN page上组织为10个组,仅基于错误编号,并且没有说明哪个组中列出了哪些错误。
  • 当我试图发现 OpenInputDesktop 如何帮助我让我的代码更加防弹时,我又发现了这一点:
  

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

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

示例很多,GetWindowRect也被广泛使用,MSDN提供与GetCursorPos完全相同的有限信息。

问题:

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

1 个答案:

答案 0 :(得分:2)

至于提前知道某个特定功能可以返回哪些错误代码,我担心微软很久以前就决定维护所有功能的文档过于繁琐和昂贵, API函数可以调用任意数量的其他API函数,而这些函数又可以调用其他函数,依此类推。有时候你很幸运,MSDN doc会调用特定于该函数的错误代码,就像ReadFile一样,但是你注意到的并不是所有函数的情况。

话虽如此,处理GetLastError()返回的错误代码的标准方法是format them with FormatMessage

如果您为lang ID传递了LANG_USER_DEFAULT,这将返回错误代码中用户所选区域设置格式化的有时有用的,有时不那么有用的错误消息。您可以向用户显示此消息。如果您想使用自己的语言对其进行格式化以进行日志记录,假设它是英语,则可以传递MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)作为lang ID。

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