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,
        0, 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 0;
}

上述代码可从[email protected]下载,链接如下:https://git.oschina.net/Tocy/SampleCode.git。位于ErrCodeParseDemo.cpp中。

时间: 2024-12-31 08:09:28

Windows API 错误码的相关文章

服务器端 API 错误码设计规范总结

1.对于API返回 定义BaseResult 类 拥有success,errorCode,errorMsg个3个基本参数,success使用boolean类型,errorCode使用int类型,errorMsg使用String类型 如下图所示

WebSocket API错误码

错误信息返回格式 { "id": "id generate by client", "status": "error", "err-code": "err-code", "err-msg": "err-message", "ts": 1487152091345 } 注:"ts" 为错误信息生成的时间戳,单位:

Windows错误码解析

阅读目录 Windows API 错误码解析 Windows异常值解析 ErrLook程序 参考资料 C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通过自己的方式进行解析.对于Windows API的错误码,则需要调用Windows的API进行解析,下面来介绍具体的错误码解析方法. 回到顶部 Windows API 错误码解析 调用Windows

GetLastError错误码大全

GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数 并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能 担保函数已成功执行.只有在函数调用返回一个错误结果时,这个函数指出的错误结果 才是有效的.通常,只有在函数返回一个错误结果,而且已知函数会设置GetLastError 变量的前提下,才应访问GetLastError:这时能保证获得有效的结果.SetLastError函 数主要在对api函数

socket学习及各类错误码(部分转)

如果本地有多个网卡(即多个ip),要指定本地发送网卡,则在建立的socket上bind所指定的网卡进行connect和send操作.例子程序如下: #include <stdio.h>#include "WinSock2.h"#pragma comment(lib,"ws2_32.lib") SOCKET tcp_socket;SOCKADDR_IN tcpAddr;const int BufLen=1024;char SendBuf[BufLen];

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

关键字:微信支付 curl出错 错误码6 错误码7 错误码28 错误码52 错误码58 错误码60 错误码77 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpay-curl-error.html 本文介绍微信支付开发集成过程中,常见的错误码及其解决方案. 1. curl错误码6 出现场景 PHP Fatal error: Uncaught exception 'WxPayException' with message 'curl出错,错误码:6'

Windows API串口编程

在Windows系统中实现串口通信的基本功能,并对有关的API函数进行解释. 打开串口函数: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile

UTF-8,Unicode,GBK,希腊字母读法,ASCII码表,HTTP错误码,URL编码表,HTML特殊字符,汉字编码简明对照表

UNICODE,GBK,UTF-8区别 UNICODE,GBK,UTF-8区别    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就O

CMPP错误码说明

与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDELIVML:zzzzSMSC返回状态报告的状态值为ACCEPTDMM:zzzzSMSC返回状态报告的状态值为UNKNOWNMN:zzzzSMSC返回状态报告的状态值为REJECTD 回页首 CMPP发送失败代码对照表 值(4位,不足4位前面补0) 含义1 消息结构错2 命令字错误3 消息序列号重复4