Windows API 错误码
在多数情况下,windows API在发生错误时很少抛出异常,多数是通过函数返回值进行处理。(windows api中无返回值的函数很少。)
windows api错误处理通常按照以下方式:首先api函数返回特殊的值,表明函数内部发生错误;然后调用方可以使用GetLastError获得对应的错误码。
通常情况下windows api按照返回类型可以分为以下几类:
- 返回值为BOOL类型。有错误发生,返回值为0,否则返回非零值。
- 返回值为HANDLE类型。有错误发生时,返回NULL或INVALID_HANDLE_VALUE(值为-1)。
- 返回值为LONG类型或DWORD类型。有错误发生时,返回0或-1。
由于windows api返回类型不太一致,所以在实际处理windows api错误时建议查看下msdn上对应的说明,并按照其中的解释处理对应的错误码。
DWORD WINAPI GetLastError(void);
通过调用GetLastError函数返回的错误码是一个DWORD类型(32bit),其固定位域映射格式如下(按照windows下小端位顺序,从低位到高位依次编号0,1,…,30,31;注意下表中都是按照二进制数据表示的):
| 位 | 含义 |
| bit30~31 | 安全级别,00=安全,01=信息,10=警告,11=错误 |
| bit29 | 错误来源,0-Microsoft定义的,1-用户自定义错误码 |
| bit28 | 保留位,必须是0 |
| bit16~27 |
错误来源的工具码,Microsoft定义的(Winerror.h) |
|
bit0~15 |
工具对应的状态码,Microsoft或用户定义。 |
如果需要的话,我们也可以自己定义错误码,并使用windows api类似的错误机制,具体可参考 SetLastError 、 SetLastErrorEx函数,但需要注意自定义的错误码不要跟windows错误码重复。
查看错误码对应的信息可以使用visual c++提供的错误查找工具(Error Lookup Tool),也可以直接在调试器的观察窗口中输入“@err, hr”。
当然也可以使用FormatMessage函数将错误码直接转化成对应的字符串。调用代码如下:
// Windows错误码解析程序,ErrCodeParseDemo
// 简单介绍如何将错误码转化为对应的字符串信息
// 建议使用vs2005以上版本编译 unicode编码
#include <windows.h>
#include <iostream>
#include <WinError.h>
using std::wcout;
using std::endl; void OutputFormatMessage(DWORD errCode)
{
LPTSTR lpMsgBuf = NULL; FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
, NULL ); wcout << "err:" << std::hex << errCode << " Msg tips:" << endl
<< lpMsgBuf << endl; LocalFree(lpMsgBuf);
} int _tmain(int argc, _TCHAR* argv[])
{
// 输出中文
std::wcout.imbue(std::locale("chs")); // 设置控制台标题栏
SetConsoleTitle(TEXT("ErrCodeParseDemo")); OutputFormatMessage(ERROR_INVALID_FUNCTION); OutputFormatMessage(ERROR_HANDLE_EOF); return ;
}
上述代码可从git@osc下载,链接如下:https://git.oschina.net/Tocy/SampleCode.git。位于ErrCodeParseDemo.cpp中。
Windows API 错误码的更多相关文章
- Windows下错误码全解析
windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...
- 火币网API文档——REST API 错误码
错误码 行情 API 错误码 错误码 描述 bad-request 错误请求 invalid-parameter 参数错 invalid-command 指令错 code 的具体解释, 参考对应的er ...
- Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- Java服务器端 API 错误码设计总结
1.对于API结果返回,定义BaseResult 类 拥有success,errorCode,errorMsg个3个基本参数,success使用Boolean类型,errorCode使用Integer ...
- API错误码设计-资料
搜索到一篇文章:新浪微博API错误代码说明对照表 可以参考新浪微博的错误码设计思路,设计自己系统的错误码.
- 火币网API文档——WebSocket API错误码
错误信息返回格式 { "id": "id generate by client", "status": "error", ...
- windows LARGE_INTEGER 错误码输出格式
如果是负数,I32X 版权声明:本文为博主原创文章,未经博主允许不得转载.
- Windows错误码解析
C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通 ...
- socket学习及各类错误码(部分转)
如果本地有多个网卡(即多个ip),要指定本地发送网卡,则在建立的socket上bind所指定的网卡进行connect和send操作.例子程序如下: #include <stdio.h>#i ...
随机推荐
- http和websocket共用同一端口
webpack热部署相关的插件 webpack-hot-middleware:是模块热替换插件,可以避免网页刷新.这个功能并不重要,因为我们可以手动刷新. webpack-dev-middleware ...
- LC_ALL=C的含义
在很多的shell脚本中,我们经常会看见某一句命令的前面有一句“LC_ALL=C” SAR_CMD="LC_ALL=C sar -u -b 1 5 | grep -i average &qu ...
- TCP_NODELAY 和 TCP_NOPUSH的解释
一.问题的来源 今天看到 huoding 大哥分享的 lamp 面试题,其中一点提到了: Nginx 有两个配置项: TCP_NODELAY 和 TCP_NOPUSH ,请说明它们的用途及注意事项. ...
- mysql/mariadb基于ssl的主从复制
当mysql/mariadb跨越互联网进行复制时别人可以窃取到mysql/mariadb的复制信息, 这些信息是明文的, 因此存在不安全性, 这里通过ssl对复制的信息进行加密 1. 创建证书中心 在 ...
- POJ 1815 Friendship (Dinic 最小割)
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 8025 Accepted: 2224 Descri ...
- POJ 2296 Map Labeler (2-Sat)
Map Labeler Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1267 Accepted: 409 Descri ...
- 【MyBatis】MyBatis之如何存储NULL
如果在sql语句中,不指定jdbcType,那么在存储中遇见null就会发生错误.一般情况下应该在每一个SQL语句的参数中指定jdbcType.比如: #{loginIp,jdbcType=VARCH ...
- 【Linux】统计命令wc
如果我想要知道 /etc/man.config 这个文件里面有多少字?多少行?多少字符的话, 可以怎么做呢?其实可以利用 wc 这个命令来达成喔!他可以帮我们计算输出的信息的整体数据! [root@w ...
- Objective-C 如何让非等宽的数字和空格对齐
在printf中,我们可以通过格式字符串来对文字进行对齐输出,比如: printf("%5d\n%5d", 12, 345); 在使用等宽字体的Console中,我们可以看到数字右 ...
- C# 获取接口数据(xml格式)转为json格式
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...