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."));
 }

 

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