【问题标题】:In Windows, is there any way to convert an errno into an HRESULT?在 Windows 中,有没有办法将 errno 转换为 HRESULT?
【发布时间】:2012-09-10 13:38:08
【问题描述】:

我知道 HRESULT_FROM_WIN32 宏将 Win32 错误代码转换为 HRESULT,有什么方法可以从 errno 错误开始进行转换?

【问题讨论】:

标签: windows com errno hresult


【解决方案1】:

简而言之,没有。

截至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 将发出的值,您可以通过检查 _doserrno 来获取系统错误代码,并且您可以使用 HRESULT_FROM_WIN32(_doserrno) 获得 HRESULT?很棒。
  • 这实际上是不正确的。通常 errno 有 CRT 错误,_doserrno 有 win32 错误,所以从技术上讲 HRESULT_FROM_WIN32(_doserrno) 应该可以工作。您是正确的,并非所有 errno 值都在 Windows 中使用,例如 ENODEV 未在 Windows 中使用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2017-03-25
    • 2021-09-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多