【发布时间】:2012-09-10 13:38:08
【问题描述】:
我知道 HRESULT_FROM_WIN32 宏将 Win32 错误代码转换为 HRESULT,有什么方法可以从 errno 错误开始进行转换?
【问题讨论】:
我知道 HRESULT_FROM_WIN32 宏将 Win32 错误代码转换为 HRESULT,有什么方法可以从 errno 错误开始进行转换?
【问题讨论】:
简而言之,没有。
截至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值。
【讨论】:
_doserrno 来获取系统错误代码,并且您可以使用 HRESULT_FROM_WIN32(_doserrno) 获得 HRESULT?很棒。
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);
【讨论】: