zoukankan      html  css  js  c++  java
  • 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; 
    }
    View Code

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

  • 相关阅读:
    复习静态页面polo-360
    fsm三种建模思路比较
    web前端学习(一) j2ee环境搭配+jsp中的编码问题
    git与github建立链接(学习笔记)
    g++编译多个源原文件和头文件(转载)
    百度搜索引擎设置
    Google自带截图工具的使用
    git与github建立链接(将本次项目与网络GitHub同步) --转存笔记
    初识JQuery(1)-选择器
    同步与异步的区别
  • 原文地址:https://www.cnblogs.com/tocy/p/windows_api_error-code_parse.html
Copyright © 2011-2022 走看看