Windows編程中獲得錯誤信息
在windows編程中我們的函數往往不如我們想象的那樣工作,他經常會出現很多這樣那樣的問題,一般情況下,我們可以通過他們的返回值來得到他們到底是否發了小脾氣:
Windows常見的返回值類 型:
1) VOID:表明該函數運行不可能失敗,Windows函 數的返回值很少是VOID。
2) BOOL:如果函數運行失敗,返回值是0,否則 返回值是非0值。最好對返回值進行測試,以確定它是0還 是非0,而不是測試返回值是否是TRUE。
3) HANDLE:如果函數運行失敗,則返回值通常是NULL, 否則返回值是某個HANDLE,用於標識你可以操作的一個對象。請注意這些值,有些函數失敗時會返回一個句柄值INVALID_HANDLE_VALUE, 它被定義爲-1。函數的Platform SDK文 檔將會清楚地說明函數運行失敗時返回值是NULL還是INVALID_HANDLE_VALUE。
4) PVOID:如果函數運行失敗,返回值是NULL, 否則返回PVOID,以標識數據塊的內存地址。
5) LONG/DWORD:這是個難以處理的值。返回數量的函數通常返回LONG或DWORD,如果由於某種原因,函數無法對想要進行計數的對象進行計數,那麼該函數通常返回0或-1(根據函數而定)。如果調用的函數返回值爲LONG或DWORD,那麼得閱讀Platform SDK以確保能正確檢測潛在的錯誤。
由此可見,得到錯誤信息對我們修改程序幫助很大,如何獲取這些錯誤信息呢。其實非常簡單,windows爲我們提供了3個API函數,我們可以使用他們來獲取錯誤信息。
DWORD WINAPI GetLastError(void);,他的作用是獲取由系統API產生的錯誤代碼,代碼的詳細信息可參考MSDN或是微軟公佈的錯誤代碼獲取API的錯誤信息,
當然,我們也可以直接讓他顯示出錯誤信息,如何操作呢,這就用到下面的函數
具體信息可參看 MSDN .
上對他的說明這裏我們使用一個簡單的例子來說明他們的用法 :
這裏是動態加載DLL,如果成功,後面代碼將正確執行,如果錯誤,將返回錯誤信息的詳細說明。其中,後面一部分代碼可以直接使用,把他加入你的代碼調用API可能出錯的地方,他將給你提示出你的函數錯誤的描述信息。
假設我們想要在自己代碼中自定義錯誤信息,這是允許的,你可以使用
DWORD dwErrCode 就是你想要設置的錯誤代碼,不過要注意的是,你的錯誤代碼不能和系統衝突,下面是系統已經定義的錯誤代碼字段信息:
位 |
31~30 |
29 |
28 |
27~16 |
15~0 |
內容 |
嚴重性 |
Microsoft/客戶 |
保留 |
Facility代碼 |
異常代碼 |
含義 |
0=成功 1=供參考 2=警告 3=錯誤 |
0=Microsoft定義的代碼 1=客戶定義的代碼 |
必須是0 |
前256個值由Microsoft保留 |
Microsoft/客戶定義的代碼 |
對於這兩個函數的具體使用和這些字段的用法,請看下集故事:windows編程中的異常處理和windows結構化異常處理方式解析。