如何将一个 HRESULT 转换为 Win32 错误码?

2023-11-12 01:52
文章标签 转换 错误码 win32 hresult

本文主要是介绍如何将一个 HRESULT 转换为 Win32 错误码?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地球人都知道,可以使用 HRESULT_FROM_WIN32 这个宏将一个 Win32 错误码转换为一个 HRESULT,但是如何将一个 HRESULT 转换为 Win32 错误码呢?

让我们先看看 HRESULT_FROM_WIN32 这个宏的定义:


#define HRESULT_FROM_WIN32(x) \
((HRESULT)(x) <= 0 ? ((HRESULT)(x)) \ : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))

如果传入宏的值小于等于零,则它将不会做任何修改,否则,它会取值的低 16 位,然后和 FACILITY_WIN32 和 SEVERITY_ERROR 合并。 我们应该如何反转这个逻辑,编写一个 WIN32_FROM_HRESULT 宏呢? 首先,我们看起来不可能编写这样一个宏,因为 HRESULT_FROM_WIN32 函数提供的映射不是一对一的。 如果正确的实现了这个宏,则我们将会得到一条将 0 映射到 S_OK 的单独算法,以及将 65536 错误代码的块映射到同一 HRESULT 空间的一系列块。 请注意,范围 1 到 0x7FFFFFFFF 中的值是 HRESULT_FROM_WIN32 宏的不可能结果。此外,0x80070000 到 0x8007FFFF 范围内的值可能来自相当多的原始 Win32 代码;你不能只选一个。 让我们先展示下这个转换函数的代码。

>> 请移步至 topomel.com 以查看图片 <<

当然,我们本来可以写的更简单一点。

>> 请移步至 topomel.com 以查看图片 <<

因为 HRESULT_FROM_WIN32 宏是幂等的:HRESULT_FROM_WIN32(HRESULT_FROM_WIN32(x)) == HRESULT_FROM_WIN32(x)。因此,如果你声明“反向”函数是微不足道的,那么在技术上是正确的。但在实践中,人们想尝试把“x”找回来,这就是我们给你的。

现在,你已经了解了 HRESULT_FROM_WIN32 宏的工作原理,我们可以根据实际的客户问题来回答以下问题:

====================================================
有时,当我从扫描仪导入数据时,会出现错误“无法删除目录”。这是什么意思?
====================================================

你将不得不使用一些精神力量来调试这个问题,但我认为你已经做到了。

HRESULT 和 Win32 错误代码的一个不幸方面是,没有包含所有错误的单个头文件。从逻辑的角度来看,这是可以理解的:

多个团队需要为其组件编造新的错误代码,但 winerror.h 文件由内核团队维护。如果选择 winerror.h 作为所有错误代码的主存储库,则意味着任何想要添加新错误代码或更改现有错误代码的团队都必须缠着内核团队为他们进行更改。

如果这些团队有自己的 SDK,事情就会变得更加复杂。例如,假设 DirectX 和 Windows Media 团队都希望在其相应的 SDK 中包含新的 winerror.h。如果以错误的顺序安装 SDK(以及如何知道应该先安装哪个,DirectX 8 还是 WMSDK 6?),则最终可能会使 winerror.h 文件回归。这是版本冲突问题,但没有版本资源的好处。

许多团队已经说服了内核团队,为他们保留了一大块错误代码。

>> 请移步至 topomel.com 以查看图片 <<

只有 65535 个 Win32 错误代码的空间,其中超过八分之一已经被这些“块分配”所淘汰。我想知道我们最终是否会因为错误代码太大而过早地用完错误代码。(这里可以与IPv4进行某种类比,但我不打算尝试。)

总结

我一直希望通过定义单个头文件来汇总所有的错误代码,但随着程序组件的越来越多,这个想法导致组件间的依赖性与日俱增,所以,我的做法是:回归到原始的错误字符串来报告错误,这样,各组件之间的错误代码就不会互相依赖和冲突了。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How do I convert an HRESULT to a Win32 error code?》

这篇关于如何将一个 HRESULT 转换为 Win32 错误码?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/394292

相关文章

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

使用C#实现将RTF转换为PDF

《使用C#实现将RTF转换为PDF》RTF(RichTextFormat)是一种通用的文档格式,允许用户在不同的文字处理软件中保存和交换格式化文本,下面我们就来看看如何使用C#实现将RTF转换为PDF... 目录Spire.Doc for .NET 简介安装 Spire.Doc代码示例处理异常总结RTF(R

OFD格式文件及如何适应Python将PDF转换为OFD格式文件

《OFD格式文件及如何适应Python将PDF转换为OFD格式文件》OFD是中国自主研发的一种固定版式文档格式,主要用于电子公文、档案管理等领域,:本文主要介绍OFD格式文件及如何适应Python... 目录前言什么是OFD格式文档?使用python easyofd库将PDF转换为OFD第一步:安装 eas

基于Java实现PPT到PDF的高效转换详解

《基于Java实现PPT到PDF的高效转换详解》在日常开发中,经常会遇到将PPT文档批量或单文件转换为PDF的需求,本文将详细介绍其使用流程、核心代码与常见问题解决方案,希望对大家有所帮助... 目录一、环境配置Maven 配置Gradle 配置二、核心实现:3步完成PPT转PDF1. 单文件转换(基础版)

使用C#实现Excel与DataTable的相互转换

《使用C#实现Excel与DataTable的相互转换》在软件开发中,Excel文件和DataTable是两种广泛使用的数据存储形式,本文将介绍如何通过C#实现Excel文件与Data... 目录安装必要的库从 Excel 导出数据到 DataTable从 DataTable 导入数据到 Excel处理 E

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方