《windows核心程式設計5》第一章-錯誤處理
阿新 • • 發佈:2019-01-31
1、函式返回HANDLE 型別判斷需要格外注意, NULL被定義為0 ,INVALID_HANDLE_VALUE被定義為-1。LONG或者DWORD返回型別的函式在成功或者失敗時候 一般返回0或者-1。
2、函式呼叫失敗應該立即呼叫GetLastError(),其他成功函式呼叫該函式會返回ERROR_SUCCESS(0);
3、在除錯視窗的Watch欄目輸入$err,hr 可以檢視當前執行緒的“上一個錯誤程式碼和解釋“。
4、將錯誤碼數字轉化為文字描述的函式: FormatMessage, 它可以支援多種語言,能獲取一個語言標識作為引數,並返回那種語言的文字。
5、儘量使用微軟提供的錯誤碼,如果不夠用,自己可以在程式碼中設定執行緒的上一個錯誤碼,使用SetLastError(DWORD err)。使用者自定義的錯誤碼格式應該和微軟定義的錯誤碼保持一致。錯誤程式碼為32位數,其中:
(1)31-30: 嚴重性。 0x00 : 0 - 成功, 0x01: 1 - 資訊(提示), 0x10 : 2 - 警告, 0x11 : 3 - 錯誤
(2)29:Mircrosoft/客戶。0 - ms, 1 - 客戶
(3)28: 保留,必須為0
(4)27-16:Facility程式碼, 前面256個值由ms保留
(5)15-0:異常程式碼, ms或者客戶定義的程式碼
使用者自定義程式碼舉例:11,1, 0, 0000 1111 1111,1111 1111 1111 1111 - 0xE0FF FFFF
6、FormatMessage呼叫示例
#include <Windows.h> #include <string> void FormatMessageUsage(DWORD dwErrCode, std::wstring& errMsg) { DWORD systemLocal = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); HLOCAL hLocal = NULL; BOOL ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrCode, systemLocal, (PTSTR)&hLocal, 0, NULL); if (!ret) { HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES); if (NULL != hDll) { ret = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, hDll, dwErrCode, systemLocal, (PTSTR)&hLocal, 0, NULL); FreeLibrary(hDll); } } if (ret && (hLocal != NULL)) { errMsg = (PCTSTR)(LocalLock(hLocal)); LocalFree(hLocal); } return ; }