在Windows中,有没有办法将errno转换为HRESULT?

时间:2012-09-10 13:38:08

标签: windows com errno hresult

我知道要将Win32错误代码转换为HRESULT的HRESULT_FROM_WIN32宏,有没有办法从errno错误开始进行转换?

2 个答案:

答案 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);