|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2005-04-15, 02:18 PM | #1 |
榮譽會員
|
Microsoft Error Code 揭秘
Microsoft Error Code 揭秘
---------------------------------- Author: Smallfrogs Version: 1.0 [2005/03/26] ====================================================== 微軟產品有一個良好的設計就是當出現錯誤的時候,會有各種各樣的錯誤號碼出現。在Windows 2000以前,錯誤號以10進制一般,到了Windows 2000以後,錯誤號更多的趨向於使用16進製表示。 微軟產品的錯誤程式碼都是定義在一些.h文件裡面的,如Win32API的錯誤程式碼就定義在winerror.h文件裡面。 在WIN32API裡面,錯誤號的定義格式是這樣的: (摘自winerror.h) 程式碼 (雙按程式碼複製到貼上板)// 類型s are 32 bit values layed out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---+-+-+-----------------------+-------------------------------+ // |Sev|C|R| Facility | Code | // +---+-+-+-----------------------+-------------------------------+ // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code 如上所顯示,錯誤代號由32bit 組成,也就是說所有的WIN32API裡面的錯誤代號必須遵照上述格式。除了錯誤代號,微軟還定義了大量的巨集用於記憶和閱讀起來方便。巨集的定義是採用 C/C++ 關鍵字define完成的。格式是: 程式碼 (雙按程式碼複製到貼上板)#defiine <字串串檔案類型的錯誤代號> <數值檔案類型的錯誤代號> 此外,微軟對大多數常用的錯誤代號作了簡單的文字描述。用戶可以使用微軟提供的API函數 FormatMessage 將錯誤代號轉換為對應的文字描述。 使用FormatMessage的一個典型工具就是在 Visual C++ 6 裡面提供的Error LookUp。這個工具能夠將用戶輸入的錯誤代號轉化為對應的文字描述(如果有的話)。此外,以前網路上比較流行的錯誤號尋找工具也使用了FormatMessage這個函數。 FormatMessage的一個Sample是這樣的: 程式碼 (雙按程式碼複製到貼上板)void ErrorExit(LPTSTR lpszFunction) { TCHAR szBuf[80]; LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, "%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); MessageBox(NULL, szBuf, "Error", MB_OK); LocalFree(lpMsgBuf); ExitProcess(dw); } 當然,到了具體使用中,還有其他更複雜的考慮,如進制轉換等。 但是由於微軟產品眾多,很難在同一個文件裡面將所有錯誤程式碼包含,而且不同產品由於各種原因,造成不同了不同的產品可能有不同的錯誤程式碼的格式,如果說人為的查閱各種.h文件試圖找到一個方法,可想而知的是這樣做的效率如何。在這種情況下,一個全新的工具 出現了。 這就是我今天要推薦的一個錯誤號查詢工具:Err.exe 工具是關於指令行方式操作的,1.62M的程序內裝了絕大多數微軟產品的錯誤程式碼。當然也包括了上面介紹的Win32API的錯誤程式碼。 據我所知,目前版本的Err.EXE飽含了19871種錯誤程式碼訊息,涵蓋了172個文件。我想這個數位對於絕大多數用戶來說已經足夠了。 Err.EXE的使用方式是: 錯誤程式碼作為Err.EXE的參數傳入Err.EXE,要查詢錯誤程式碼的時候,輸入以下指令。假設我查詢一個叫做 0x50 的錯誤代號的含義,則輸入 程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50 Err.EXE將返回和0x50有關的錯誤代號的含義。 返回的結果分為4個部分: 1、以#開頭的是作者增加的註釋 2、左半部分指錯誤代號對應的巨集定義文字訊息 3、右半部分各種.h文件表示是在什麼文件裡面發現這個錯誤代號的。 4、最下面是搜尋到多少個對應的錯誤程式碼。 又因為發生0x50錯誤的時候是在一個I/O操作的時候,我大概可以判定錯誤可能來源於Win32API函數,於是檢查有winerror.h的那行,發現Err.EXE指出的含義是: ERROR_FILE_EXISTS 根據這個訊息再進去行後續的工作就方便多了。 提示:Err.EXE支持省略輸入 如果需要輸入的內容是: 程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x00000050 那麼可以省略輸入為 程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50 Err.EXE也能夠準確的識別出你輸入的內容。 更難能可貴的事,Err.EXE還能夠支持對錯誤字串串搜尋來反查詢錯誤程式碼,而且對於不能搜尋到的錯誤號能夠將錯誤號分段,然後猜測大概的意思,能做到這樣一個是由於微軟產品設計的規範性,另一個原因就是Err.EXE的開發者的獨具匠心的設計。 最後,附上 Err.EXE 下載位址: http://www.microsoft.com/downloads/d...displaylang=en Note:不要被微軟網頁迷惑,Err.EXE不僅適用於Exchange,而且適用於絕大多數的微軟產品。 Note:Err.EXE屬於綠色軟體,從微軟網站下載以後是一個自解壓文件,你可以使用WinRAR解壓,解壓以後有一份說明 我的文件,使用前建議先看看它,看完了以後對於快速掌握Err.EXE是很有說明 的。 附件是VC6帶的Error Lookup工具,大家可以試試看看。如果有興趣,可以把上面說的那段程式碼編譯一下看看,你會驚奇的發現 Error Lookup 的設計還是很簡單的。 |
__________________ |
|
送花文章: 3,
|