• 【windows核心编程】第一章 错误处理


    1、常见的windows函数返回类型

     1 VOID      //不返回任何类型,不会失败
     2 
     3 BOOL     //TRUE for FALSE, typedef int BOOL
     4 
     5 HANDLE    //句柄类型,函数失败返回NULL 或 INVALID_HANDLE_VALUE,后者INVALID_HANDLE_VALUE被定义为宏((HANDLE)(LONG_PTR)-1), 其中LONG_PTR被定义为
     6 
     7                         //Typedef _W64 long LONG_PTR, *PLONG_PTR, LONG_PTR在VC++ WIN32配置下为32位,在X64配置下为64位。
     8 
     9 PVOID               //PVOID被定义为typedef void *PVOD; 如果函数失败返回NULL,否则返回一个标志内存块的指针
    10 
    11 LONG/DWORD   //其返回值代表的含义需要根据MSDN的解释来,没有固定招数,其中DWORD被定义为unsigned long

    2、关于错误代码

     1 DWORD GetLastError();
     2 
     3 错误代码在winerror.h中定义
     4 
     5 #define ERROR_SUCCESS   0L
     6 
     7 #define NO_ERROR        0L
     8 
     9 //MessageID   GetLastError返回值
    10 
    11 //MessageText  错误描述信息

    一个windows函数失败之后应该立即调用GetLastError获得其错误代码,当windows检测到错误时会使用“线程本地存储(Thread-Local-Storage)”的机制来将相应的错误代码和主调线程关联到一起。

    调试程序时,在Visual Studio的watch窗口Name字段中输入:$err,hr ,这样在调试时即可随时查看windows函数的GetLastError的值和对应的描述信息。

    根据错误代码获得其对应的文本描述信息的方法:

     1 DWORD FormatMessage(
     2 
     3          DWORD  dwFlags, //标记
     4 
     5          LPCVOID  pSource, //表明这个值是消息资源来自哪里,依赖dwFlags
     6 
     7          DWORD  dwMessageId,  //错误代码
     8 
     9          DWORD  dwLanguageId,  //错误描述信息的语言
    10 
    11          PTSTR   pszBuffer,  //接收错误描述信息的输出缓冲区
    12 
    13          DWORD  nSize,//如果FORMAT_MESSAGE_FROM_ALLOCATE_BUFFER则这个参数设置以TCHARs为单位的输出缓冲区最小尺寸,不能大于64KB
    14 
    15          Va_list  *Argumentgs
    16 
    17 );
    18 
    19  
    20 
    21 //Eg.
    22 
    23 HLOCAL hLocal  = NULL;
    24 
    25 BOOL bRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
    26 
    27 NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
    28 
    29 (PTSTR)&hLocal, 0, NULL
    30 
    31 );
    32 
    33  
    34 
    35 if(TRUE == bRet)
    36 
    37 {
    38 
    39          CString str(_T(“错误信息:”));
    40 
    41          AfxMessageBox(str + CString((LPWSTR)LocalLock(hLocal)) );  
    44 
    45          LocalFree(hLocal); 
    47 }

    3、定义自己的错误代码

    1 VOID SetLastError(DWORD   dwErrCode);

    关于DWORD表示的32位数中,从低位0---高位31位,

    0—15位为MS/客户定义的代码;

    16-27位中,前256个值由MS保留,剩余的供客户定义;

    第28位必须为0,第29位为0表示MS定义的代码,为1表示客户定义的代码,这样保证MS和客户的定义的不会重复;

    30—31中,0表示成功,1表示信息提示,2表示警告,3表示错误。

    4、Visual Studio的工具菜单中一般都会有一个【错误查找】的命令,如果没有则到VS的开始菜单或者安装目录下查找这个工具,这个工具可以用来根据错误代码查找错误描述信息。

      

  • 相关阅读:
    阻止事件冒泡
    移动端开发
    angular6 管道多参数传输 Pipe
    在div上添加小三角
    angular6 使用@Input() @Output()
    angular6 想要获取页面某些事件 如 点击 window宽高等等
    如何将项目添加到git上
    使用vue-cli 搭建element-admin后台
    bootstrap4 常用样式类名 (供自己参考)
    键盘按下 keyCode 的值
  • 原文地址:https://www.cnblogs.com/cuish/p/3061089.html
Copyright © 2020-2023  润新知