Windows错误码解析
C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来。对于自己定义的错误码,可以通过自己的方式进行解析。对于Windows API的错误码,则需要调用Windows的API进行解析,下面来介绍具体的错误码解析方法。
Windows API 错误码解析
调用Windows API失败后,通常需要通过GetLastError来获取对应的错误码,要将此错误码解析为对应的描述信息,则需要调用另外一个Windows API FormatMessage,原型如下:
DWORD WINAPI FormatMessage(
_In_ DWORD dwFlags,
_In_opt_ LPCVOID lpSource,
_In_ DWORD dwMessageId,
_In_ DWORD dwLanguageId,
_Out_ LPTSTR lpBuffer,
_In_ DWORD nSize,
_In_opt_ va_list *Arguments
);
具体的参数意义就不在这里介绍了,直接查看MSDN即可,下面来看一下具体的使用方法示例:
char msg[1024] = { 0 };
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 5, LANG_NEUTRAL, msg, _countof(msg), NULL);
cout << msg << endl;
运行程序即可看到对应的错误描述:拒绝访问。
Windows异常值解析
程序在运行的时候,难免会产生一些异常,通过Windows的SEH机制可以得到此异常信息,其中会包含一个异常值,比如0xC0000008。如果用上面提到的FormatMessage的方式,获取到的消息是一个字符串,或者无法获取到此异常值的描述。那么如何获取这个异常值的描述呢,仔细看FormatMessage API的MSDN文档,可以看到有这样一个标志:
FORMAT_MESSAGE_FROM_HMODULE
这个标志的意思是:可以通过其他模块,来解释此异常值或者错误码。
那么什么模块会包含Windows异常值的定义和解释呢,通过谷歌或者MSDN可以知道,是“ntdll.dll”。
知道了这些,就可以写程序来解释Windows异常值了,代码如下:
char msg[1024] = { 0 };
HMODULE hntdll = LoadLibrary("NTDLL.DLL");
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE,
hntdll, 0xC0000008, LANG_NEUTRAL, msg, _countof(msg), NULL);
FreeLibrary(hntdll);
cout << msg << endl;
ErrLook程序
当的程序中确实需要对Windows错误码和Windows异常值进行解析的时候,就可以使用上面的方法进行解析。
但是当我们只是简单的想看看一个错误码的解释的时候,难道还必须写一个程序来解释吗。
微软也考虑到了你正在思考的这一点,所以在安装了VS后,都会附带一个小工具,用来解释错误码,叫做:ErrLook,一般可以在VS的工具菜单中看到,或者可以在“VS目录\Common7\Tools”目录下找到这个程序,如下:



参考资料
How to translate NTSTATUS error codes to message strings
Windows错误码解析的更多相关文章
- Windows错误码大全
0000 操作已成功完成.0001 错误的函数.0002 系统找不到指定的文件.0003 系统找不到指定的路径.0004 系统无法打开文件.0005 拒绝访问.0006 句柄无效.0007 存储区控制 ...
- DB2 错误码解析
DB2 错误代码大全——SQLSTATE 消息 SQLSTATE 消息本节列示 SQLSTATE 及其含义.SQLSTATE 是按类代码进行分组的:对于子代码,请参阅相应的表. 表 2. SQLS ...
- python windows错误码
在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问 在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问.那么是删除权限不够?用管理员 ...
- 使用JLDAP操作LDAP,包含匿名连接、ldif导入导出、获取根节点、对数据的操作、LDAP错误码解析等
bean类 package com.cn.ccc.ggg.ldap.model; import javax.persistence.Entity; import javax.persistence.T ...
- Windows API 错误码
在多数情况下,windows API在发生错误时很少抛出异常,多数是通过函数返回值进行处理.(windows api中无返回值的函数很少.) windows api错误处理通常按照以下方式:首先api ...
- Windows下错误码全解析
windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...
- Redis Windows 服务启动异常 错误码1067
https://blog.csdn.net/after_you/article/details/62215163 Redis Windows 服务启动异常 错误码1067 下载了Redis 2.8.2 ...
- 微信支付curl出错及错误码解决方案
1. curl错误码6 出现场景 PHP Fatal error: Uncaught exception 'WxPayException' with message 'curl出错,错误码:6' in ...
- CMPP错误码说明
与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...
随机推荐
- Python-面向对象(类)一
一.如何创建类 class cls: pass 二.创建方法 构造方法: __init__(self, arg) obj = 类('a1') 普通方法: obj = 类('xxx') obj.普通方法 ...
- RocksDB安装
1.安装相关依赖软件 sudo apt-get install build-essential sudo apt-get install libsnappy-dev zlib1g-dev libbz2 ...
- 图文介绍如何在Eclipse统计代码行数(转)
使用Eclipse可以方便的统计工程或文件的代码行数,方法如下: 1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File... 2.选中正则表达式(Regular expressi ...
- BeautifulSoup研究一
BeautifulSoup的文档见 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 其中.contents 会将换行也记录为一个子节 ...
- Maven的配置和使用(二)
Maven仓库 使用Maven带给我们一个比较直接的好处是管理jar包,这些jar包默认地址是在C:\Users\用户名.m2 目录下,我们来修改下这个地址: 现在自己想建立的仓库地址的路径下新建文件 ...
- 泛型的排序问题(Collections.sort及Comparable的应用)
一.前言 java中对泛型(集合类型)排序的问题,主要采用了两张方式一种是对要排序的实体类,实现Comparable接口,另一种方式,Collections集合工具类进行排序. 二.实现Comp ...
- Git Commands Quick Notes
Fetch This command is to make sure your local repository has the same knowledge of the remote-tracki ...
- MongoDB实现分页(两种方法)
1.插入实验数据 偷懒用下samus,100条. ; i < ; i++) { Document doc = new Document(); doc["ID"] = i; d ...
- vertical-align和line-height的那些事
可能是又遇到了瓶颈,好长时间感觉css上没什么可看.从来没觉得css有什么难,什么盒模型和各种流也觉得理解起来毫不费力,但好像仅限于此.对一些属性仅限于常用,有时会去做实验验证一些属性,过后就忘了.现 ...
- Editbox之三个框框
自重装系统后,电脑中两个版本的eclipse都驾崩了,起个VS也要花费半年的时间(观赏收费),所以就运用已有的工具STS编了代码,不能用JavaFX很是遗憾,只能在网上找了代码,自己修改后完成了测试. ...