Windows核心编程__错误处理

 

文章内容
1.定义自己的错误代码
2.ErrorShow示例程序
在深入讨论Windows提供的诸多特性之前,应该先理解各个Windows函数是如何进行错误处理的。
调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将支出函数因为某些原因失败了。下表展示了大多数Windows函数使用的返回值的数据类型。

数据类型                            指出函数调用失败的值
—————————————————————————————————————
VOID         这个函数不可能失败。只有极少数Windows函数的返回值类型为VOID
—————————————————————————————————————
BOOL         如果函数失败,返回值为0;否则,返回值是一个非0值。应避免测试返
           回值是否为TRUE,最稳妥的方法是检查它是否不为FALSE
—————————————————————————————————————
HANDLE     如果函数失败,则返回值通常为NULL;否则,HANDLE将标识一个可以操作
          的对象。请注意这种返回值,因为某些函数会返回INVALID_HANDLE_VALUE
          的一个句柄值,它被定义成-1.函数Platform SDK文档清楚说明了函数是返
          回NULL还是INVALID_HANDLE_VALUE来标识失败    
—————————————————————————————————————
PVOID     如果函数调用失败,则返回值为NULL。否则,PVOID将标识一个数据块的
          内存地址
—————————————————————————————————————
LONG/DWORD   这种类型比较棘手。返回计数的函数通常会返回LONG或DWORD。如果函
            数出于某种原因不能对我们想要技术的东西进行计数,它通常会返回0
            或者-1。
—————————————————————————————————————
Microsoft编辑了一个一个列表,其中列出了所有可能的错误代码,并为每个错误代码都分配一个32位的编号。
函数返回时,如果发生错误,要查看具体是什么错误,情调用GetLastError函数,如下所示:
DWORD GetLastError();
此函数可以返回一个32位错误码,有了32位错误码,接着需要把它转化成为更有用的信息。Windows提供了一个函数,可以将错误代码转换成为相应的文本描述,此函数为FormatMessage,声明如下:
DWORD FormatMessage(
   DWORD dwFlags,
   LPCVOID lpSource,
   DWORD dwMessageId,
   DWORD dwLanguageId,
   LPSTR lpBuffer,
   DWORD nSize,
   va_list *Arguments
   );
自己定义自己的错误代码
我们会尽量使用WinError.h中现有的代码,只要代码能很好地反应我们想报告的错误。如果WinError.h中的任何一个代码都不能准确反映一个错误,就可以创建自己的代码。错误代码是一个32位数
位          31-30          29             28         27-16          15-0
-----------------------------------------------------------------------
内容        严重性     Microsoft/客户    保留      Facility代码   异常代码
----------------------------------------------------------------------
含义    0 = 成功      0 = Microsoft    必须为0   前256个值由   Microsoft/
        1 = 信息(提示)  定义的代码           Microsoft保留  客户的代码
        2 = 警告      1 = 客户定义的
        3 = 错误      代码

ErrorShow示例程序

DWORD dwError;
 //获得错误编码
 dwError = GetDlgItemInt(IDC_EDIT_ERRORCODE,NULL,FALSE);
 HLOCAL hlocal = NULL;
 BOOL fOK = FormatMessage(
              FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
     FORMAT_MESSAGE_ALLOCATE_BUFFER,
     NULL,dwError,0,
     (PTSTR)&hlocal,0,NULL);
 if (fOK && (hlocal != NULL))
 {
  SetDlgItemText(IDC_EDIT_ERRORTEXT,(PCTSTR)LocalLock(hlocal));
  LocalFree(hlocal);
 }
 else
 {
  SetDlgItemText(IDC_EDIT_ERRORTEXT,TEXT("No Text Found for this ERROR number."));
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章