windows編程中的錯誤處理
本文用于本人收藏之用。
閱讀《windows核心編程》的筆記
開始windows編程之前,要了解windows函數是怎么做錯誤處理的。
當調用一個windows函數的時候。它首先檢查傳遞給它的各個參數的有效性,然后再設法做處理。
當傳入一個錯誤的參數或操作在處理過程中出現不成功,則返回一個值。
當返回值是VOID的時候,是不可能錯誤的。
當返回值是LONG/DWORD的時候。windows處理比較復雜。一般如果返回0或-1 表示不能計數。
Microsoft公司編譯了一個錯誤表,為每個錯誤分配一個32位的號碼。當發生錯誤的時候??梢哉{用GetLastError()函數,得到最近的錯誤。注意:該函數只返回32位的錯誤號。
WinError.h中包含了錯誤代碼的列表。這個文件的列表內容是這樣的:
//MessageId: ERROR_SUCCESS
//MessageText:
//
//The operation completed suclearcase/" target="_blank" >ccessfully.
//
#define ERROR_SUCCESS 0L
... ...
每個錯誤都是這樣描述的:錯誤ID號,錯誤文本,錯誤號碼(一般,應該避免使用號碼,可以使用ID號)。
同時記?。寒攚indows函數運行失敗,請立即運行GetLastError()函數進行錯誤處理。但是,當windows函數運行成功,它就不會改寫錯誤代碼,并不指明運行成功。(當然有例外)
在windows98中,不能使用這種機制來發現錯誤。因為,windows98很大部分是16位函數。
在調試的時候,在Watch窗口中輸入“@err,hr”,就可以顯示最后一個函數調用時的錯誤號碼和錯誤英文描述文本
如果在程序編寫中,想把錯誤顯示給用戶看,windows提供了一個函數:FormatMessage定義如下:
DWORD FormatMessage(DWORD dwFlags , LPCVOID pSource , DWORD MessageID , DWORD dwLanguageID ,
PTSTR pszBuffer , DWORD nSize , va_list * Arguments );
FormatMessage()函數的功能非常豐富,向用戶顯示消息,它是首選函數。后面會展示該函數的用法。
以上是windows的錯誤處理機制,你也可以在你的程序中使用這種機制。
將你認為合適的號碼傳給windows的線程池調用下面的函數:SetLastError(DWORD dwErrCode);
最好,能在WinError.h中存在的錯誤號。如果你實在是找不到反映你實際需要代碼,可以自己創建錯誤號。
錯誤號可以劃分域的:31~30 表示嚴重性(0 表示成功 1 表示供參考 2 表示警告 3 表示錯誤)
29 表示是用戶定義的錯誤號還是是Microsoft定義:0 表示是Microsoft定義的 1 表示用戶定義的。
28 是保留 必須是0 。
27~16 設備代碼,由Microsoft定義。
15~0 錯誤代碼,由Microsoft或用戶定義。
這些,還會在以后的文章中涉及!
下面開始是一個示例程序,重點展示如何使用FormatMessage函數:
//This is a copy of the book windows kernel programing //I don't know how to translate the book's name.Please forgive me
///////////// *** program start now ***////////////////
// Get the error code
DWORD dwError = GetDlgItemInt(hwnd,IDC_ERRORCODE,NULL,FALSE);
HLOCAL hLocal = NULL; //Buffer that gets the error message strings
//Get the error code's textual discription
BOOL fOK = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError , MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), (LPTSTR) & hLocal , 0 , NULL);
... ...
if(!hLocal != NULL){
SetDlgItemText(hwnd,IDC_ERRORTEXT,(PCTSTR) LocalLock(hLocal));
LocalFree(hLocal);
}else{
SetDlgItemText(hwnd,IDC_ERRORTEXT,TEXT("Error number not found."));
}
今天就寫這么多了。不愿意再寫下去了。下面還有一個示例,就是上面這個程序的完整代碼,我得好好研究。
這樣才可以學習好編程~!
I like study
wsyghk