函數錯誤處理二(總結自己windows編程核心)

  1. /*
  2.     1:定義自己的錯誤碼
  3.     微軟的錯誤碼返回機制也適用於我們自己寫的函數。
  4.     爲了表示一個錯誤,通常情況下設置一個線程的最後錯誤碼然後函數再返回一個
  5.     不可用值就可以了,比如NULL,FALSE,INVALID_HANDLE_VALUE等任何想返回的值。
  6.     設置線程的最後錯誤碼可以使用函數:
  7.         VOID SetLastError(DWORD dwErrCode);
  8.     這個函數需要一個32位的數值,任意值,通常情況下,如果函數返回的錯誤與MS
  9.     在WinError.h中定義的錯誤碼相符,最好還是用MS已經定義的錯誤碼。如果你
  10.     WinError.h中找不到適合自己函數的錯誤碼,我們也可以創建自己的錯誤碼,但
  11.     錯誤碼的各個位都有其要求,具體如下:
  12.     
  13.     15-0位:
  14.         表示異常碼,可以是MS定義的,也可以是我們自己定義的
  15.     27-16位:
  16.         設備碼,這12位可以表示4096個設備碼,但前256個被MS保留它用。
  17.     28位:
  18.         保留位,必須爲0
  19.     29位:
  20.         錯誤碼所屬類別位,0表示錯誤碼是由MS定義的,1表示是由用戶定義的。
  21.     31-30位:
  22.         錯誤碼類型位,0表示成功,1表示信息,2表示警告,3表示失敗
  23. */
  24. /*
  25.     2:顯示錯誤的例子
  26.     通過錯誤碼獲取錯誤的描述,關鍵是使用函數FormatMessage,例子如下:
  27. */
  28. //獲取錯誤碼
  29. DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);
  30. HLOCAL hlocal = NULL;   // Buffer that gets the error message string
  31. //通過語言的主標識符和子標識符得到一個語言標識符
  32. DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
  33. /*
  34.     函數成功時返回描述內容的長度,以TCHAR爲單位,失敗時返回0
  35. */
  36. BOOL fOk = FormatMessage(
  37.                          FORMAT_MESSAGE_FROM_SYSTEM     |
  38.                          //此標識意爲系統定義的錯誤碼的描述
  39.                          FORMAT_MESSAGE_IGNORE_INSERTS  |
  40.                          //此標識意爲可在描述中使用%以顯示更多的信息
  41.                          FORMAT_MESSAGE_ALLOCATE_BUFFER,
  42.                          //此標識意爲函數內部申請足夠容納下整個描述的空間
  43.                          NULL, 
  44.                          //只要第一個參數中不包括FORMAT_MESSAGE_FROM_HMODULE
  45.                          //或FORMAT_MESSAGE_FROM_STRING,第二個參數就沒有
  46.                          //意義,可設置爲NULL
  47.                          dwError, //錯誤碼
  48.                          systemLocale,//錯誤碼的描述語言
  49.                          (PTSTR) &hlocal,//描述內容數據塊的指針
  50.                          0,
  51.                          //當第一個參數中指定了FORMAT_MESSAGE_ALLOCATE_BUFFER
  52.                          //則此參數的意思是要申請的最小TCHAR的數目
  53.                          //如果沒有指定這個標識,這個參數需要傳遞描述內容
  54.                          //的長度,以TCHAR爲單位
  55.                          //此參數的最大長度不可大於64KB
  56.                          NULL);
  57. if (!fOk) 
  58. {
  59.     //如果上面提取描述的過程失敗,則檢查一下是不是網絡的原因
  60.     HMODULE hDll = LoadLibraryEx(
  61.                                 TEXT("netmsg.dll"),
  62.                                 NULL,
  63.                                 DONT_RESOLVE_DLL_REFERENCES);
  64.     if (hDll != NULL)
  65.     {
  66.         /*
  67.             在這裏再次調用FormatMessage,顯示網絡檢查的結果
  68.         */
  69.         fOk = FormatMessage(
  70.                             FORMAT_MESSAGE_FROM_HMODULE     |
  71.                             FORMAT_MESSAGE_IGNORE_INSERTS   |
  72.                             FORMAT_MESSAGE_ALLOCATE_BUFFER,
  73.                             hDll,
  74.                             dwError,
  75.                             systemLocale,
  76.                             (PTSTR) &hlocal,
  77.                             0,
  78.                             NULL);
  79.         FreeLibrary(hDll);
  80.     }
  81. }
  82. if (fOk && (hlocal != NULL)) 
  83. {
  84.     //顯示錯誤描述
  85.     SetDlgItemText(
  86.                     hwnd,
  87.                     IDC_ERRORTEXT,
  88.                     (PCTSTR) LocalLock(hlocal));
  89.     LocalFree(hlocal);
  90. }
  91. else 
  92. {
  93.     SetDlgItemText(
  94.                     hwnd,
  95.                     IDC_ERRORTEXT,
  96.                     TEXT("No text found for this error number."));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章