我知道要将Win32错误代码转换为HRESULT的HRESULT_FROM_WIN32
宏,有没有办法从errno
错误开始进行转换?
答案 0 :(得分:5)
简而言之,没有。
截至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值。
答案 1 :(得分:1)
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);