我知道HRESULT_FROM_WIN32
将 Win32 错误代码转换为 HRESULT 的宏,有没有办法从errno
错误开始进行转换?
2 回答
简而言之,没有。
截至http://msdn.microsoft.com/en-us/library/5814770t%28v=vs.100%29.aspx
errno 值是在发生各种错误情况时分配给 errno 的常量。
ERRNO.H 包含 errno 值的定义。但是,并非 ERRNO.H 中给出的所有定义都用于 32 位 Windows 操作系统。存在 ERRNO.H 中的某些值是为了保持与 UNIX 系列操作系统的兼容性。
32 位 Windows 操作系统中的 errno 值是 XENIX 系统中 errno 值的子集。因此,errno 值不一定与 Windows 操作系统的系统调用返回的实际错误代码相同。要访问实际的操作系统错误代码,请使用包含此值的 _doserrno 变量。
当然,您可以使用将“翻译”错误代码的 switch-cases 编写自己的函数。
可以看到在 windows 上定义了大约 80 个 errno 值。
Windows CRT 应始终设置 _doserrno 和 errno。_doserrno 将具有 Win32 错误,而 errno 将具有 UNIX errno 值。
Windows CRT 不会设置所有 errno 值,例如 ENODEV 是第一个未使用的值。
要从 Win32 错误转到 errno,_get_errno_from_oserr 将映射它。因为映射是有损的,所以没有人可以选择另一种方式。
_dosmaperr 通常用于设置 CRT 错误并设置两个全局变量。有时 CRT 会手动设置错误。
与其使用全局变量,不如使用get / set版本,例如。_get_doserrno(),但全局变量应该在正常流程中工作。
// this should work in a realistic flow like:
if (_snwprintf(buf, ARRAYSIZE(buf), L"%i", i) == -1) {
hr = HRESULT_FROM_WIN32(_doserrno);
}
// or, this is a little more robust
unsigned long err = 0;
NTASSERT(!_get_doserrno(&err));
HRESULT hr = HRESULT_FROM_WIN32(err);