如果没有错误发生,哪个WinAPI函数将最后一个错误设置为ERROR_SUCCESS?

时间:2016-02-19 17:42:09

标签: c++ winapi error-handling

有一个庞大的遗留代码库似乎在某些难以重现和调查的情况下失败。

它调用一些WinAPI函数,比如CopyFile,而不是检查返回码,检查GetLastError()值。我知道这是错误的,但是知道非空的最后错误值是来自此调用还是先前发生的事情真的很好。如果我确定CopyFile将最后一个错误设置为ERROR_SUCCESS以防一切顺利,那么就足以断定此特定呼叫失败了。

MSDN提到某些功能会执行此操作,但有些功能却没有,但没有具体说明哪些功能。是否有一些非正式的清单/参考文献涵盖了这个问题?

1 个答案:

答案 0 :(得分:5)

GetLastError()使用情况按功能记录。没有单个主列表记录哪些函数对GetLastError()采取哪种方式。如果没有记录任何给定的函数设置上一个错误,使用GetLastError()检查函数退出后的最后一个错误。

设置上一个错误的大多数功能不会将其设置为成功,仅在失败时设置,并记录为这样。

执行设置成功时的最后一个错误的函数会记录,并且还会记录哪个成功条件将最后一个错误设置为哪个值。这通常是 ,在函数的返回值不明确函数是否成功的情况下使用,因此GetLastError()用于区分。例如,大多数函数在失败时返回0,但某些函数可能在成功和失败时返回0。在这种情况下,如果GetLastError()然后返回0(或定义的成功代码),则函数成功,否则函数失败。 GetTLSValue()就是一个例子。

一个值得注意的例外是创建命名内核对象的函数(CreateMutex()CreateEvent()CreateSemaphore()等)。它们在成功时返回非零值,但GetLastError()将返回0或ERROR_ALREADY_EXISTS,具体取决于函数是否返回新创建的对象或现有对象的句柄。每个函数都会相应地记录下来。