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

问题描述 投票:6回答:2

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

windows com errno hresult
2个回答
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
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.