1. 程式人生 > >《windows核心程式設計5》第一章-錯誤處理

《windows核心程式設計5》第一章-錯誤處理

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  ;
}