- /*
- 1:定義自己的錯誤碼
- 微軟的錯誤碼返回機制也適用於我們自己寫的函數。
- 爲了表示一個錯誤,通常情況下設置一個線程的最後錯誤碼然後函數再返回一個
- 不可用值就可以了,比如NULL,FALSE,INVALID_HANDLE_VALUE等任何想返回的值。
- 設置線程的最後錯誤碼可以使用函數:
- VOID SetLastError(DWORD dwErrCode);
- 這個函數需要一個32位的數值,任意值,通常情況下,如果函數返回的錯誤與MS
- 在WinError.h中定義的錯誤碼相符,最好還是用MS已經定義的錯誤碼。如果你
- WinError.h中找不到適合自己函數的錯誤碼,我們也可以創建自己的錯誤碼,但
- 錯誤碼的各個位都有其要求,具體如下:
- 15-0位:
- 表示異常碼,可以是MS定義的,也可以是我們自己定義的
- 27-16位:
- 設備碼,這12位可以表示4096個設備碼,但前256個被MS保留它用。
- 28位:
- 保留位,必須爲0
- 29位:
- 錯誤碼所屬類別位,0表示錯誤碼是由MS定義的,1表示是由用戶定義的。
- 31-30位:
- 錯誤碼類型位,0表示成功,1表示信息,2表示警告,3表示失敗
- */
- /*
- 2:顯示錯誤的例子
- 通過錯誤碼獲取錯誤的描述,關鍵是使用函數FormatMessage,例子如下:
- */
- //獲取錯誤碼
- DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);
- HLOCAL hlocal = NULL; // Buffer that gets the error message string
- //通過語言的主標識符和子標識符得到一個語言標識符
- DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
- /*
- 函數成功時返回描述內容的長度,以TCHAR爲單位,失敗時返回0
- */
- BOOL fOk = FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM |
- //此標識意爲系統定義的錯誤碼的描述
- FORMAT_MESSAGE_IGNORE_INSERTS |
- //此標識意爲可在描述中使用%以顯示更多的信息
- FORMAT_MESSAGE_ALLOCATE_BUFFER,
- //此標識意爲函數內部申請足夠容納下整個描述的空間
- NULL,
- //只要第一個參數中不包括FORMAT_MESSAGE_FROM_HMODULE
- //或FORMAT_MESSAGE_FROM_STRING,第二個參數就沒有
- //意義,可設置爲NULL
- dwError, //錯誤碼
- systemLocale,//錯誤碼的描述語言
- (PTSTR) &hlocal,//描述內容數據塊的指針
- 0,
- //當第一個參數中指定了FORMAT_MESSAGE_ALLOCATE_BUFFER
- //則此參數的意思是要申請的最小TCHAR的數目
- //如果沒有指定這個標識,這個參數需要傳遞描述內容
- //的長度,以TCHAR爲單位
- //此參數的最大長度不可大於64KB
- NULL);
- if (!fOk)
- {
- //如果上面提取描述的過程失敗,則檢查一下是不是網絡的原因
- HMODULE hDll = LoadLibraryEx(
- TEXT("netmsg.dll"),
- NULL,
- DONT_RESOLVE_DLL_REFERENCES);
- if (hDll != NULL)
- {
- /*
- 在這裏再次調用FormatMessage,顯示網絡檢查的結果
- */
- fOk = FormatMessage(
- FORMAT_MESSAGE_FROM_HMODULE |
- FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_ALLOCATE_BUFFER,
- hDll,
- dwError,
- systemLocale,
- (PTSTR) &hlocal,
- 0,
- NULL);
- FreeLibrary(hDll);
- }
- }
- if (fOk && (hlocal != NULL))
- {
- //顯示錯誤描述
- SetDlgItemText(
- hwnd,
- IDC_ERRORTEXT,
- (PCTSTR) LocalLock(hlocal));
- LocalFree(hlocal);
- }
- else
- {
- SetDlgItemText(
- hwnd,
- IDC_ERRORTEXT,
- TEXT("No text found for this error number."));
- }
函數錯誤處理二(總結自己windows編程核心)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.