深入HRESULT与Windows Error Codes的区别详解

DB2错误代码(SQL error codes)说明:解析与解决 本文将深入探讨DB2数据库中的常见错误代码,解释它们的含义,并提供相应的解决方法。通过理解这些错误代码,您将能够更有效地诊断和解决问题,提升数据库管理的效率。 阅读详情
在用C++来开发Windows程序时,经常看到下面的判断情况:
复制代码 代码如下:

HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);
if (SUCCEEDED(hr))
{

在代码中,使用SUCCEEDED宏来判断函数RegCreateKeyEx()函数的返回值。
有些程序员认为RegCreateKeyEx返回0的时候就是成功,而S_OK就是0,所以就习惯性的用SUCCEEDED宏来做判断。
还有些人用下面的方法判断,看起来更严谨一些:
复制代码 代码如下:

HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);
if (S_OK == hr)
{

确实,第2种更严谨一些,至少不会造成大问题,而第1中则完全是一个大Bug,这个bug在正常情况下是没有问题的。但一旦有问题,你也发现不了。
错在哪里呢?听我下面来介绍。

SUCCEEDED
先看下这个宏的定义(WinError.h):
复制代码 代码如下:

//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//
#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)

从这里可以看出,它就是把hr转换成HRESULT类型,然后做了下是否大于0的判断。注释中也说明:但值为非负数时表示成功。
也就是说,只要HRESULT是大于等于0的值,它就认为是成功的。

HRESULT
再来看下HRESULT的定义(winnt.h):
复制代码 代码如下:

// Component Object Model defines, and macros
#ifndef _HRESULT_DEFINED
#define _HRESULT_DEFINED
typedef LONG HRESULT;
#endif // !_HRESULT_DEFINED

哦,原来HRESULT就是一个Long型的整数。
在MSDN中,可以查到更加详细的资料:

image

如上图,HRESULT是一个4字节的Long型,总共32位。其中:
第31位是s位,即符号位,因为HRESUlT格式规定所有成功都是正的整数,失败的值都是负数
第30位是r位,是保留位,但n位(28位)没有设置时,它必须是0;如果n位使用了,则和s位一起来标识NTSTATUS的值。
第29位是c位,表示Custom,即自定义位,如果是微软定义的返回值,则该位为0;如果是自定义的,则该位为1.
第28位是n位,表示NTSTATUS,值为0的话可以把NTSTATUS值映射为一个HRESULT值。
第27位是x位,保留位,必须为0.
第26位到第16位是Facility,用11位来表示错误来源,比如
复制代码 代码如下:

FACILITY_WINDOWS 表示来自Windows子系统

第15位到第1位是Code位,用来保存错误值。

从这里可以看出,只有最后面的2个字节是用来表示返回值的其它的都是辅助信息,它主要用于COM函数的返回值。

常见HRESULT值

NameDescriptionValue
S_OK操作成功0x00000000
S_FALSE操作成功,但是有问题0x00000001L
E_ABORT操作中止0x80004004
E_ACCESSDENIED拒绝访问0x80070005
E_FAIL未知错误0x80004005

注意:除了S_OK外,还有一个S_FALSE,它也属于成功。
所以,微软为了方便大家使用,专门提供了SUCCEEDED宏和FAILED宏来方便大家做判断。
到这里,大家明白了吧:SUCCEEDED宏是用来判断COM中的函数执行是否成功用的,失败为负数,成功为0和正数。

Windows Error Code
前面的代码中我们调用了一个Windows API:
复制代码 代码如下:

:RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);

这个API的声明是:
复制代码 代码如下:

LONG WINAPI RegCreateKeyEx(
  __in        HKEY hKey,
  __in        LPCTSTR lpSubKey,
  __reserved  DWORD Reserved,
  __in_opt    LPTSTR lpClass,
  __in        DWORD dwOptions,
  __in        REGSAM samDesired,
  __in_opt    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __out       PHKEY phkResult,
  __out_opt   LPDWORD lpdwDisposition
);

从MSDN中知道,它成功时返回的是ERROR_SUCCESS,其它值则是失败,其它值就是类似GetLastError的错误码。这些错误码就是Windows Error Code。

Windows Error Codes
微软在WinError.h定义了大量的Windows Error Codes,这种错误码范围是0x0000~0xFFFF,即2个字节,但没限定死2个字节,也可以用4个字节来保存。在Windows API中,大量的使用了这种错误码。比如上面的注册表API,它的返回值就是这种错误码。
这种错误码还有个特点是微软为这些错误码定义了比较详细的可阅读的描述信息,它可以通过FormatMessage函数来获得,在中文环境下,显示的是翻译后的中文。

Windows Error Codes 除了ERROR_SUCCESS外,都是正数,也就是不能用SUCCEEDED宏来判断,因为这个宏只判断是不是非负数,对于它而言,所有的Windows Error Codes都是成功的。

常见的Windows Error Codes

Win32 error codesDescription
0x00000000
ERROR_SUCCESS
The operation completed successfully.
0x00000000
NERR_Success
The operation completed successfully.
0x00000001
ERROR_INVALID_FUNCTION
Incorrect function.
0x00000002
ERROR_FILE_NOT_FOUND
The system cannot find the file specified.
0x00000003
ERROR_PATH_NOT_FOUND
The system cannot find the path specified.
0x00000004
ERROR_TOO_MANY_OPEN_FILES
The system cannot open the file.
0x00000005
ERROR_ACCESS_DENIED
Access is denied.

所以前面的代码中,混淆了HRESULT和Windows Error Code,特别是第一种代码,当注册表失败时它也会判断为成功,第2种因为两个都是0,碰巧不会出问题,但是建议还是不要这么混用。

总结

Unity游戏设计与实现——南梦宫一(卷一) Unity游戏设计与实现——南梦宫一(共四卷) 立即下载

相关推荐

【化工设备防腐】基于BF凝水除铁缓蚀剂的螺旋板换热器腐蚀与冷凝水发红问题综合治理技术应用

内容概要:本文针对氯碱厂盐水螺旋板预热器腐蚀渗漏及蒸汽冷凝水发红、偏酸性的问题,提出并实施了采用BF凝水除铁缓蚀剂成膜法的综合治理方案。通过分析腐蚀原因,确认主要为二氧化碳引起的酸性腐蚀和溶解氧导致的氧腐蚀。在原有阴极保护与局部防腐涂层改造基础上,进一步投加BF凝水除铁缓蚀剂,该药剂能在金属表面形成单分子保护膜,有效阻隔腐蚀介质,实现全系统气液两相的协同防护。经72小时试验,冷凝水pH值恢复至8.5以上,铁离子浓度降至0.07mg/L以下,颜色清澈透明,达到回用标准,实现了设备安全运行与冷凝水高效回收。; 适合人群:从事化工、电力、锅炉系统管理及相关工业设备维护的技术人员与工程管理人员,尤其适用于面临换热器腐蚀、冷凝水水质异常问题的企业技术人员。; 使用场景及目标:①解决工业蒸汽系统中冷凝水发红、铁离子超标、pH偏低等腐蚀问题;②提升冷凝水回收率,降低能耗与水资源浪费,实现节能减排与降本增效;③替代传统除氧剂与末端过滤设备,优化现有水处理工艺。; 阅读建议:此资源结合实际案例提供系统性解决方案,读者应重点关注问题诊断逻辑、药剂作用机制与实施流程,可将其作为类似工况下腐蚀治理的技术参考,并结合自身系统特点进行可行性评估与小试验证。

win10系统在Vs2012工具菜单中添加ildasm.exe工具的操作办法

http://www.dngswin10.com/dngs/36089.html 有关win10系统在Vs2012工具菜单中添加ildasm.exe工具的操作方法想必大家有所耳闻。但是能够对win10系统在Vs2012工具菜单中添加ildasm.exe工具进行实际操作的人却不多。其实解决win10系统在Vs2012工具菜单中添加ildasm.exe工具的问题也不是难事,小编这里提示两点:1、在win10系统中打开Vs2012; 2、选择[工具]/[外部工具...],单击[添加]按钮;掌握这些就够了。如果还

小宝哥Code的专栏 955

YOLOv8中Bottleneck模块的残差连接机制解析

本文深入解析了YOLOv8目标检测模型中Bottleneck模块的核心设计,重点阐述了其残差连接机制。该机制通过构建一条信息“捷径”,有效缓解了深层网络中的梯度消失问题,稳定了训练过程,并提升了特征提取效率。文章结合代码详细拆解了模块结构,并探讨了其在YOLOv8骨干网络与检测头中的关键作用及参数调优思路。

weixin_29061821的博客 253

有趣的HRESULT

有趣的HRESULT Author: ume Date: 2012-02-19 Outline:“Here’s Result” HRESULTstructure FAILED/SUCCEEDED MAKE_HRESULT FormatMessage 长时间进行Windows编程的人一定对HRESULT特别熟悉,因为HRESULT作为一种函数的返回值类型曝...

tempsitegoogle 566

STC89C52RC单片机原理图详解

左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里。74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展。由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,

m0_50562428的博客 6万+

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战

A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义.

Java进阶营 312

Windows 7 安装软件错误:“Error 1935 ...HRESULT: 0x800736FD” 的解决办法

Windows 7系统上安装软件时,有时会出现类似下面的错误: Product: Microsoft Visual C++ 2005 Redistributable -- Error 1935.An error occurred during the installation of assembly 'Microsoft.VC80.OpenMP,type="win32",version

goodjie_12的专栏 5854

STM32F4+FreeRTOS实战:手把手教你移植LWIP2.1.2(含LAN8720配置避坑指南)

本文提供了一份详尽的实战指南,手把手教你如何在STM32F4平台结合FreeRTOS实时操作系统,成功移植轻量级TCP/IP协议栈LWIP 2.1.2。文章重点剖析了硬件驱动层LAN8720 PHY芯片的配置要点与常见“坑点”,并深入讲解了LWIP与FreeRTOS的深度整合、关键配置及稳定性优化策略,旨在帮助开发者构建稳定可靠的产品级嵌入式网络功能。

ik678901234的博客 1063

HRESULT错误码

Return value/code Description 0x00030200 STG_S_CONVERTED The underlying file was converted to compound file format. 0x00030201 STG_S_B...

如鹿渴慕泉水的专栏 1万+

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1952

【25届数字IC秋招总结】面试经验15——比特大陆-算能

25届数字ic面试记录——比特大陆-算能

lalala0635的博客 553

C++零食:HRESULT 与 Windows Error Codes 不是一回事

在用C++来开发Windows程序时,经常看到下面的判断情况: HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL); if (SUCCEEDED(hr)) { 在代码中,使用SUCCEEDE...

aohaizhi7722的博客 531

微信支付接口「系统繁忙 SYSTEM_ERROR」/「文件不存在」报错分析与解决方案 接口开发实现SDK

微信支付的“平台证书模式”只有5年的有效期,过期后微信支付将不再签发新的平台证书,转而要求开发者使用“微信支付公钥”来处理敏感信息加密及回调签名验证。然而,由于以下几点原因,许多开发者在调用 获取平台证书。尽管微信支付在技术迭代上有其必要性,但报错设计过于不友好。诸如“系统繁忙”这样的提示很难直接关联到平台证书失效或公钥切换问题。这样的信息表达,开发者不仅看不懂,还需要花费大量时间分析排查,非常影响效率。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 779

HRESULT和Windows Error Codes的一些基础介绍

<br />在用C++来开发Windows程序时,经常看到下面的判断情况:HRESULT hr = ::RegCreateKeyEx (hk , szKeyPath , 0, NULL , REG_OPTION_NON_VOLATILE , KEY_QUERY_VALUE , NULL , &hk , NULL );<br /><br />if (SUCCEEDED (hr )) <br /> {<br />在代码中,使用SUCCEEDED宏来判断函数RegCreateKey

做一个优雅的程序员 1914

PowerDesigner 数据库建模使用详解

PowerDesigner 数据库建模使用详解

congge 7081

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Wand-Enhancer 如何免费解锁 WeMod Pro?两种补丁方法选型与上手实操

WeMod 免费账号用满 2 小时就得重新登录,AI 指南、配置保存等 Pro 功能一直点不动。开源工具 Wand-Enhancer 在本地修补客户端文件,免费解锁这些 Pro 能力。 ## 🧭 Wand-Enhancer 速览:做什么、给谁用 - 定位:一个 Windows 桌面补丁程序,面向 WeMod(Wand)客户端,完全开源、免费。 - 给谁用:不想付 Pro 费用、也不想改动账号

gitblog_00825的博客 911

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HRESULT 与 Windows Error Codes 不是一回事

在用C++来开发Windows程序时,经常看到下面的判断情况: HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL); if (SUCCEEDED(hr)) { 在代码中,使用SUCCEEDED宏来判断函数RegCrea

swanabin的专栏 563

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Windows系统错误代码解析与实战处理技巧

系统错误代码是操作系统与应用程序交互的重要通信机制,Windows通过标准化的错误代码体系标识各类异常情况。从技术原理看,这些预定义的错误代码通过特定编号和宏定义,精确描述了文件操作、权限校验、资源分配等核心系统功能中的异常状态。开发实践中,合理利用GetLastError等API获取错误上下文,结合FormatMessage生成可读描述,能显著提升调试效率。特别是在处理ERROR_ACCESS_DENIED等高频错误时,需要掌握权限检查、路径验证等关键技术手段。通过封装错误处理逻辑和建立错误代码知识库,开

weixin_34021089的博客 500

WSL 容器 C API 镜像导入实战:WslcImportSessionImageFromFile 从文件导入镜像完整指南

`WslcImportSessionImageFromFile` 是 WSL 容器 C API(Wslc SDK)中用于将本地 tar 格式容器镜像直接导入到 WSL 会话的核心接口。本文基于该 API 的官方参考文档,结合仓库源码(SDK 封装层、服务端实现与 Docker HTTP 客户端)与测试用例,系统讲解其函数签名、参数语义、调用示例、底层工作原理与错误处理,帮助开发者把离线分发的镜像文

gitblog_00375的博客 1031

WSL C API 未实现功能清单:`E_NOTIMPL` 返回值、UDP 端口映射与固定 VHD 的限制说明

本文是 [WSL](https://link.gitcode.com/i/beff88c34efde625835b1b9915285f2b) 仓库中 C 语言 API 参考文档 [not-yet-implemented-apis.md](https://link.gitcode.com/i/beff88c34efde625835b1b9915285f2b/blob/74c6ac9abb77f336

gitblog_00727的博客 485

HRESULT返回值说明(转)

HRESULT返回值说明 如果函数正常执行,则返回 S_OK,同时真正的函数运行结果则通过参数指针返回。如果遇到了异常情况,则COM系统经过判断,会返回相应的错误值。 HRESULT         值          含义 S_OK            0x00000000  成功 S_FALSE         0x00000001  函数成功执行完成,但返回时出现错误 E_INVALI

sols000的专栏 5510

Windows System Error Codes (exit codes)

Improve your productivity and save time.  Let your system work for you. Description The Command and WinCommand task sometimes do not return any error messages, when your batch files fail.  These t

lovenjoy的专栏 9101

打开winform格式出现错误:Error HRESULT E_FAIL has been returned from a call to a COM component.

打开winform格式出现错误:Error HRESULT E_FAIL has been returned from a call to a COM component.

i18039072267的博客 806

PostgreSQL Error Codes (PostgreSQL错误代码)

PostgreSQL服务器发出的所有消息都分配了五个字符的错误代码, 这些代码遵循 SQL 的"SQLSTATE"代码的约定。 需要知道发生了什么错误条件的应用程序通常应该检测错误代码,而不是查看文本错误消息。 这些错误代码不太可能随着PostgreSQL的版本的更新而修改, 并且一般也不会随着错误消息的本地化而发生修改。请注意有些(但不是全部) PostgreSQL生成的错误代码是由 SQL 标准定义的; 有些标准里并没有定义的错误条件会被发明或者是从其它数据库借过来。根据标准,错误代码的头两个字符表示错

★【World Of Moshow 郑锴】★ 2340

HRESULT返回值说明

转自:http://blog.chinaunix.net/uid-16937328-id-3148101.html 如果函数正常执行,则返回S_OK,同时真正的函数运行结果则通过参数指针返回。如果遇到了异常情况,则COM系统经过判断,会返回相应的错误值。 HRESULT         值          含义 S_OK            0x00000000  成功 S_FALSE

白永辉的专栏 3148
上一篇: WinDbg学习笔记二 - 第一个例子,以及常用窗口
下一篇: COM接口:dispinterface、Dual、Custom
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值