0

在我的 C++ Windows 应用程序中,在重叠 I/O 操作失败后,我使用 GetLastError() 收到了似乎无效的系统错误代码。

// Code
DWORD errorCode = GetLastError();
loggerInt1(LOGERROR, "failed getIoResult, errorCode %d", (int)errorCode);

// Log file
failed getIoResult, errorCode -1073741781
failed getIoResult, errorCode -1073741781
failed getIoResult, errorCode -1073741781
//... many more times at different time points

errorCode 是一个 DWORD,它是一个无符号长整数,我将它转换为 int。但 Windows 系统错误代码应该只在 0 到 15999 之间,完全在 int 范围内。

-1073741781 在 32 位系统(我的)上是 C000 002B,在 64 位系统上是 FFFF FFFF C000 002B。解释为 unsigned long 它是 3,221,225,515(32 位)或一些非常大的数字(64 位)。无论哪种方式,它都远远超出了 Windows 系统错误的 0-15999 范围。

怎么会这样?为什么我得到这样的错误代码有合理的理由吗?

4

1 回答 1

2

0xC000002B 是一个NTSTATUS代码,解析为STATUS_PARITY_ERROR.

没有合同约定此处存储的值是标准 Win32 错误代码。GetLastError模糊的文档暗示了这一点:

函数返回的错误代码不是 Windows API 规范的一部分,并且可能因操作系统或设备驱动程序而异。因此,我们无法提供每个函数可以返回的错误代码的完整列表

标准错误代码有据可查,因此如果最初理解所有可能的结果,上述陈述就没有多大意义。

请注意,某些 WINAPI 也可以返回 HRESULT 值。

于 2014-02-13T20:36:49.170 回答