天天看點

Win32 Error

一、Win32錯誤

也就是Win32子系統産生的錯誤。當我們在自己的代碼裡調用Windows系統的API函數,系統執行API内部代碼,當API内部代碼出現錯誤,會将預先定義好的錯誤代碼寫到調用這個API的線程局部存儲區域(這個區域是每個線程獨有的其他線程無法更改。它存儲着一些線程獨有的東西),然後API傳回,傳回值告訴我們該API執行失敗了。如果我們的代碼加了檢測,發現了API失敗,這時我們調用GetLastError() 函數去擷取這個錯誤代碼,這個錯誤代碼是一個DWORD值。如果我們不及時擷取,就會被後面調用的API所覆寫。當我們想在自己的函數裡借用這種機制時,可以調用SetLastError函數來設定一個錯誤代碼。

這裡我們提到了兩個API:

DWORD GetLastError(VOID)

void SetLastError(DWORD dwErrCode)

二、Win32 Error Code

所有Win32錯誤代碼都必須在0x0000到0xFFFF範圍内,盡管Win32錯誤代碼可以同時用于16位字段和32位字段,我們通常還是用32位來表示。大多數值已經定義了預設錯誤消息,可用于将值映射到我們可以讀懂的文本消息。它的構成如下:

Win32 Error

雖然win32子系統錯誤的位域有32bit,但受限于值的範圍,也隻能是0x00000000---0x0000FFF,也就是上面的位域高16bit都是0。

三、擷取錯誤具體資訊

<code>通過前面的說明我們了解了錯誤代碼的擷取,以及錯誤代碼和資訊是怎麼制作出來的,那麼當我們用GetLastError擷取到錯誤代碼後,我們隻是有了一個編号,還是不了解具體什麼原因什麼錯誤,這時,我們該用到另外一個函數了FormatMessage。</code>

<code>原型:</code>

<code>DWORD</code> <code>WINAPI FormatMessage (</code>

<code>                            </code><code>DWORD</code> <code>dwFlags, </code><code>// source and processing options</code>

<code>                            </code><code>LPCVOID</code> <code>lpSource, </code><code>// message source</code>

<code>                            </code><code>DWORD</code> <code>dwMessageId, </code><code>// message identifier</code>

<code>                            </code><code>DWORD</code> <code>dwLanguageId, </code><code>// language identifier</code>

<code>                            </code><code>LPTSTR</code> <code>lpBuffer, </code><code>// message buffer</code>

<code>                            </code><code>DWORD</code> <code>nSize, </code><code>// maximum size of message buffer</code>

<code>                            </code><code>va_list</code> <code>*Arguments </code><code>// array of message inserts</code>

<code>                            </code><code>);</code>

它的功能就是将GetLastError函數得到的錯誤資訊(這個錯誤資訊是數字代号)轉化成字元串資訊的函數。

四、總結

我們可以自定義錯誤代碼和資訊,通過SetLastError來實作我們自己的代碼的錯誤處理機制,然後通過系統API或自定義函數的傳回值,檢測函數是否失敗,若失敗,通過GetLastError函數擷取線程裡目前的錯誤代碼,在通過<code>FormatMessage</code>來查詢錯誤資訊,寫到我們自己的日志裡,來幫助我們調試程式的功能性和業務性問題。

上一篇: Win32 檔案(3)
下一篇: [Win32]系列2

繼續閱讀