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

 

  

 

你可能感兴趣的:(windows)