哪个 WinAPI 函数将最后一个错误设置为ERROR_SUCCESS(如果未发生错误)

Which WinAPI function set last error to ERROR_SUCCESS if no error occured?

本文关键字:错误 如果 SUCCESS ERROR 函数 WinAPI 最后一个 设置 哪个      更新时间:2023-10-16

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

它调用一些WinAPI函数,例如CopyFile,而不是检查返回代码,而是检查GetLastError()值。我知道这是错误的,但是很高兴知道非null最后一个错误值是否源自此调用或之前发生的事情。如果我确定CopyFile将最后一个错误设置为 ERROR_SUCCESS以防一切顺利,那么就足以得出结论,此特定调用失败。

MSDN提到有些函数这样做,有些不这样做,但没有具体说明哪些函数这样做。是否有一些非官方列表/参考资料涵盖此问题?

GetLastError()用法是按函数记录的。 没有单一的主列表记录哪些功能在GetLastError()方面以何种方式起作用。 如果任何给定函数未记录为设置最后一个错误,请不要在函数退出后使用 GetLastError() 检查最后一个错误。

大多数设置最后一个错误的函数不会在成功时设置它,只会在失败时设置它,并且记录在案。

在成功

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

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

相关文章: