假设GetDC(hWnd)被称为WM_CREATE上的第一个指令,则对于窗口hWndGetDC()是否可以返回NULL

我担心由于缺乏资源而导致GetDC()失败的可能性。发生这种情况时,我应该检查错误吗?如果通话失败,该怎么办? Win32 API函数会引发异常还是应该引发异常?

最佳答案

GetDC()确实可能失败,无论您何时何地调用它。在处理API时,您应该持相当悲观的态度,并为任何API函数失败做好准备。如您所建议,失败的可能原因之一是系统资源耗尽,例如内核句柄,GDI对象等

因此,您应始终检查错误。不仅仅是GetDC(),对API函数的每次调用都应检查其返回值。

Windows API不会通过引发异常来表示错误。而是总是通过API函数返回的值来指示错误。您需要查阅文档以了解每个功能如何报告错误。

如果您在GetDC()之类的GDI函数中遇到故障,那么您将无能为力。在您描述的情况下,我将记录错误或将错误报告给用户,然后终止执行。 GetDC()失败通常无法恢复。

每次调用API函数时都要检查错误的痛苦是我们拥有这么多框架封装低级API的原因之一。一个好的框架将为您执行错误检查,并将所有错误转换为异常。使用一个好的框架可以使您专注于正常的执行流程,而不会在特殊情况下用处理代码来乱码。

10-06 13:15