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”目录下找到这个程序,如下:

参考资料

FormatMessage function

How to translate NTSTATUS error codes to message strings

Windows错误码解析的更多相关文章

  1. Windows错误码大全

    0000 操作已成功完成.0001 错误的函数.0002 系统找不到指定的文件.0003 系统找不到指定的路径.0004 系统无法打开文件.0005 拒绝访问.0006 句柄无效.0007 存储区控制 ...

  2. DB2 错误码解析

    DB2 错误代码大全——SQLSTATE 消息   SQLSTATE 消息本节列示 SQLSTATE 及其含义.SQLSTATE 是按类代码进行分组的:对于子代码,请参阅相应的表. 表 2. SQLS ...

  3. python windows错误码

    在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问 在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问.那么是删除权限不够?用管理员 ...

  4. 使用JLDAP操作LDAP,包含匿名连接、ldif导入导出、获取根节点、对数据的操作、LDAP错误码解析等

    bean类 package com.cn.ccc.ggg.ldap.model; import javax.persistence.Entity; import javax.persistence.T ...

  5. Windows API 错误码

    在多数情况下,windows API在发生错误时很少抛出异常,多数是通过函数返回值进行处理.(windows api中无返回值的函数很少.) windows api错误处理通常按照以下方式:首先api ...

  6. Windows下错误码全解析

    windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...

  7. Redis Windows 服务启动异常 错误码1067

    https://blog.csdn.net/after_you/article/details/62215163 Redis Windows 服务启动异常 错误码1067 下载了Redis 2.8.2 ...

  8. 微信支付curl出错及错误码解决方案

    1. curl错误码6 出现场景 PHP Fatal error: Uncaught exception 'WxPayException' with message 'curl出错,错误码:6' in ...

  9. CMPP错误码说明

    与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...

随机推荐

  1. wpf 触发器理解

    (1)属性触发器:其对应的类是Trigger.它在特定关联属性发生变化时被触发.一个属性的更改会在另一个属性中触发即时或动态更改. (2)数据触发器:其对应的类是DataTrigger.它在特定的CL ...

  2. js/jQuery使用过程中常见问题

    目录 一.jQuery选择器选择选中的或者disabled的选择框时attr函数无效 二.jQuery each函数的break/continue 三.jQuery 获取元素的left会值/left数 ...

  3. PHP CI框架 result()详解

    该方法执行成功返回一个对象数组,失败则返回一个空数组. 一般情况下,我们使用下面的方法遍历结果,代码就像这样: $query = $this->db->query("要执行的 S ...

  4. Map的性能

    HashMap Map基于散列表的实现(它取代了Hashtable).插入和查询"键值对"的开销是固定的.可以通过构造器设置容量和负载因子,以调整容器的性能 LinkedHashM ...

  5. sass基础用法

    嵌套: 1.选择器嵌套: 2.属性嵌套; .box {     border-top: 1px solid red;     border-bottom: 1px solid green; } .bo ...

  6. 【原】iOS学习之PINCache第三方缓存框架

    在项目中总是需要缓存一些网络请求数据以减轻服务器压力,业内也有许多优秀的开源的解决方案.通常的缓存方案都是由内存缓存和磁盘缓存组成的,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化. 1.PINC ...

  7. 时代杂志发文:2017 AR/MR将变得比VR更加重要

    每到年末都有很多企业或高管分析科技产业明年趋势.近日,时代杂志网页版刊登了2017年科技行业的五大趋势和热点话题的预测.该本作者TimBajarin,是硅谷市场研究公司CreativeStrategi ...

  8. Codeforces Round #259 (Div. 2)

    A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...

  9. 获取文件Md5值

    private static string GetFileMD5(string filePath) { string _md5Value = string.Empty; try { if (Syste ...

  10. javascript 全局对象--w3school

    JavaScript全局对象 1.  decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...