【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的开始菜单或者安装目录下查找这个工具,这个工具可以用来根据错误代码查找错误描述信息。

  

原文地址:https://www.cnblogs.com/cuish/p/3061089.html