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

news2024/11/17 14:16:24

地球人都知道,可以使用 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?》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于CST的电磁感应透明设计与机制研究

前言 电磁感应透明&#xff08;EIT&#xff09;最早在量子力学中提出&#xff0c;但是量子系统实验条件十分苛刻且费用较高&#xff0c;超材料的出现对电磁感应透明的研究提供了一种新的方法。利用超材料单元结构设计灵活&#xff0c;通过排列不同结构可以实现操控电磁波而且能…

Vue3-组合式API下的父传子和子传父

组合式API下的父传子 基本思想&#xff1a; 1.父组件中给子组件绑定组件 2.子组件内部通过props选项接收 const propsdefineProps({属性名:类型}) 由于script上写了setup&#xff0c;所以无法直接配置props选项&#xff0c;所以需要借助于“编译器宏”函数接收传递的数据 …

《Redis实战》笔记

文章目录 1.字符串命令2.列表命令3.集合命令4.散列命令5.有序集合命令6.发布订阅命令7.其他命令8.redis事务9.键的过期时间10.redis的持久化 1.字符串命令 2.列表命令 3.集合命令 4.散列命令 5.有序集合命令 6.发布订阅命令 7.其他命令 8.redis事务 5个命令&#xff1a;WATCH …

Python开发运维:Python3.7使用QQ邮箱发送不同类型邮件

目录 一、理论 1.邮件发送 二、实验 1.Python3.7使用QQ邮箱发送普通邮件 2.Python3.7使用QQ邮箱发送包含图片与附件的邮件 三、问题 1.Pycharm中如何放大和缩小代码界面 一、理论 1.邮件发送 &#xff08;1&#xff09;概念 SMTP&#xff08;Simple Mail Transfer Pro…

lv11 嵌入式开发 ARM指令集上 5

1 导学 1.1 指令集 指令 能够指示处理器执行某种运算的命令称为指令&#xff08;如加、减、乘 ...&#xff09; 指令在内存中以机器码&#xff08;二进制&#xff09;的方式存在 每一条指令都对应一条汇编 程序是指令的有序集合 指令集 处理器能识别的指令…

雷达检测及MATLAB仿真

文章目录 前言一、雷达检测二、Matlab 仿真1、高斯和瑞利概率密度函数①、MATLAB 源码②、仿真 2、归一化门限相对虚警概率的曲线①、MATLAB 源码②、仿真 3、检测概率相对于单个脉冲 SNR 的关系曲线①、MATLAB 源码②、仿真 4、改善因子和积累损失相对于非相干积累脉冲数的关系…

EtherCAT报文-LRW(逻辑寻址读写)抓包分析

0.工具准备 1.EtherCAT主站 2.EtherCAT从站(本文使用步进电机驱动器) 3.Wireshark1.EtherCAT报文帧结构 EtherCAT使用标准的IEEE802.3 Ethernet帧结构,帧类型为0x88A4。EtherCAT数据包括2个字节的数据头和44-1498字节的数据。数据区由一个或多个EtherCAT子报文组成,每个子…

超简单的Linux FTP服务搭建教程

目录 前言1、检查vsftp是否已安装2、安装vsftpd3、启动ftp服务4、测试ftp服务5、上传文件配置总结 前言 本文记录了在Kylin Linux Desktop V10(SP1)系统上搭建FTP服务的过程。FTP是File Transfer Protocol的缩写&#xff0c;译为文件传输协议&#xff0c;是用于在网络上进行文…

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…

Leetcode-2 两数相加

不知道为什么有些测试用例通不过&#xff0c;思路很明晰&#xff0c;改不明白了&#xff0c;求大佬指点&#xff01;&#xff01;&#xff01;&#xff01; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNo…

箱线图(boxplot)

箱线图 boxplot 简述原理绘制方法python - matplotlib加载功能模块加载数据绘制boxplot python - seaborn加载功能模块加载数据绘制boxplot R - ggplot加载功能模块加载数据绘制boxplot 简述 因图形形状如箱子而得名。箱线图常用于展示一组连续型数据的分散情况。学术界普遍认…

Linux AMH 服务器管理面板远程访问

文章目录 1. 前言2. Linux 安装AMH 面板3. 本地访问AMH 面板4. Linux安装Cpolar5. 配置AMH面板公网地址6. 远程访问AMH面板7. 固定AMH面板公网地址8、结语 1. 前言 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP …

第十八章 Swing 程序设计

目录 概述 Swing常用窗体 JFrame 窗体 JDialog 对话框 JOptionPane 小型对话框 1.自定义对话框 2.确认框 3.输入框 4.通知框 常用布局管理器 null绝对布局 FlowLayout 流布局管理器 BorderLayout 边界布局管理器 GridLayout 网络布局管理器 常用面板 JPa…

Linux RPM包安装、卸载和升级

我们以安装 apache 程序为例。因为后续章节还会介绍使用源码包的方式安装 apache 程序&#xff0c;读者可以直观地感受到源码包和 RPM 包的区别。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到表 1 所…

Doris:多源数据目录(Multi-Catalog)

目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …

抖音小程序开发:探索技术创新的代码之旅

随着抖音小程序的兴起&#xff0c;企业纷纷将目光投向这个充满活力的平台。抖音小程序开发不仅为品牌提供了更广泛的曝光机会&#xff0c;更是技术创新的舞台。本文将带领读者深入探索抖音小程序开发的技术要点&#xff0c;探讨如何通过代码实现个性化、高效的小程序。 1. 小…

JavaScript从入门到精通系列第三十三篇:详解正则表达式语法(二)

文章目录 一&#xff1a;正则表达式 1&#xff1a; 检查一个字符串中是否有. 2&#xff1a;第二种关键表达 3&#xff1a;第三种关键表达 ​编辑4&#xff1a;第四种关键表达 5&#xff1a;第五种关键表达 6&#xff1a;第六种关键表达 二&#xff1a;核心表达二 1&am…

拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、用户使用手册)

拓扑排序软件设计 前言1. 需求分析2. 可行性分析2.1 简介2.2 技术可行性分析2.2.1 技术实现方案2.2.2 开发人员技能要求2.2.3 可行性 2.3 操作可行性分析2.4 结论 3. 项目报告3.1 修订历史记录3.2 软硬件环境3.3 需求分析3.4 详细设计3.4.1 类设计3.4.2 核心流程描述3.4.3 核心…

水果音乐编曲软件 FL Studio v21.1.1.3750 中文免费破解版下载(附中文设置教程)

FL studio21中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xff0c;您的工作会变得…

内网安全-基础设施构建-cobaltstrike远控工具beacon使用

kali在CS文件目录下&#xff0c;打开终端,运行命令&#xff1a; /teamserver 192.168.77.128 123456 在windows中双击bat文件&#xff1a; 填写图下信息&#xff1a; 双击运行&#xff0c;CS上线 自查方法&#xff1a;1、kali与物理机可互通 2、物理机与windows10跳板…