程式設計師必讀

s函式使用的返回值的數據類型。 r函式,該函式返回的錯誤代碼)是0 s函式可能返回的所有錯誤代碼。

第1章 對程式錯誤的處理
在開始介紹Microsoft Windows 的特性之前,必須首先了解Wi n d o w s的各個函式是如何進
行錯誤處理的。
當調用一個Wi n d o w s函式時,它首先要檢驗傳遞給它的的各個參數的有效性,然後再設法
執行任務。如果傳遞了一個無效參數,或者由於某種原因無法執行這項操作,那么作業系統就
會返回一個值,指明該函式在某種程度上運行失敗了。表 1 - 1列出了大多數Wi n d o w s函式使用
的返回值的數據類型。
表1-1 Wi n d o w s函式常用的返回值類型
數 據 類 型 表示失敗的值
V O I D 該函式的運行不可能失敗。Wi n d o w s函式的返回值類型很少是V O I D
B O O L 如果函式運行失敗,那么返回值是0,否則返回的是非0值。最好對返回值進行測試,
以確定它是0還是非0。不要測試返回值是否為T R U E
H A N D L E 如果函式運行失敗,則返回值通常是N U L L,否則返回值為H A N D L E,用於標識你可
以操作的一個對象。注意,有些函式會返回一個句柄值I N VALID_ HANDLE_VA L U E,
它被定義為- 1。函式的Platform SDK文檔將會清楚地說明該函式運行失敗時返回的是
N U L L還是I N VA L I D _ H A N D L E _ VA L I D
P V O I D 如果函式運行失敗,則返回值是N U L L,否則返回P V O I D,以標識數據塊的記憶體地址
L O N G / D W O R D 這是個難以處理的值。返回數量的函式通常返回 L O N G或D W O R D。如果由於某種
原因,函式無法對想要進行計數的對象進行計數,那么該函式通常返回 0或- 1(根據
函式而定)。如果調用的函式返回了L O N G / D W O R D,那么請認真閱讀Platform SDK
文檔,以確保能正確檢查潛在的錯誤

一個Wi n d o w s函式返回的錯誤代碼對了解該函式為什麼會運行失敗常常很有用。 M i c r o s o f t
公司編譯了一個所有可能的錯誤代碼的列表,並且為每個錯誤代碼分配了一個 3 2位的號碼。
從系統內部來講,當一個Wi n d o w s函式檢測到一個錯誤時,它會使用一個稱為執行緒本地存
儲器(thread-local storage)的機制,將相應的錯誤代碼號碼與調用的執行緒關聯起來(執行緒本地存儲
器將在第2 1章中介紹)。這將使執行緒能夠互相獨立地運行,而不會影響各自的錯誤代碼。當函
數返回時,它的返回值就能指明一個錯誤已經發生。若要確定這是個什麼錯誤,請調用
G e t L a s t E r r o r函式:
該函式只返回執行緒的3 2位錯誤代碼。
當你擁有3 2位錯誤代碼的號碼時,必須將該號碼轉換成更有用的某種對象。 Wi n E r r o r. h頭
檔案包含了M i c r o s o f t公司定義的錯誤代碼的列表。下面顯示了該列表的某些內容,使你能夠看
到它的大概樣子:

免使用這個號碼,可使用訊息I D)。請記住,這裡只顯示了Wi n E r r o r. h頭檔案中的很少一部分內
容,整個檔案的長度超過2 1 0 0 0行。
當Wi n d o w s函式運行失敗時,應該立即調用G e t L a s t E r r o r函式。如果調用另一個Wi n d o w s函
數,它的值很可能被改寫。
注意 G e t L a s t E r r o r能返回執行緒產生的最後一個錯誤。如果該執行緒調用的Wi n d o w s函式
運行成功,那么最後一個錯誤代碼就不被改寫,並且不指明運行成功。有少數
Wi n d o w s函式並不遵循這一規則,它會更改最後的錯誤代碼;但是 Platform SDK文檔
通常指明,當函式運行成功時,該函式會更改最後的錯誤代碼。
Wi n d o w s 9 8 許多Windows 98的函式實際上是用M i c r o s o f t公司的1 6位Windows 3.1產
品產生的1 6位代碼來實現的。這種比較老的代碼並不通過 G e t L a s t E r r o r之類的函式來
報告錯誤,而且M i c r o s o f t公司並沒有在Windows 98中修改1 6位代碼,以支持這種錯誤
處理方式。對於我們來說,這意味著Windows 98中的許多Wi n 3 2函式在運行失敗時不
能設定最後的錯誤代碼。該函式將返回一個值,指明運行失敗,這樣你就能夠發現該
函式確實已經運行失敗,但是你無法確定運行失敗的原因。
有些Wi n d o w s函式之所以能夠成功運行,其中有許多原因。例如,創建指明的事件核心對
象之所以能夠取得成功,是因為你實際上創建了該對象,或者因為已經存在帶有相同名字的事
件核心對象。你應搞清楚成功的原因。為了將該信息返回, M i c r o s o f t公司選擇使用最後錯誤代
碼機制。這樣,當某些函式運行成功時,就能夠通過調用 G e t L a d t E r r o r函式來確定其他的一些
信息。對於具有這種行為特性的函式來說, Platform SDK文檔清楚地說明了G e t L a s t E r r o r函式
可以這樣使用。請參見該文檔,找出C r e a t e E v e n t函式的例子。
進行調試的時候,監控執行緒的最後錯誤代碼是非常有用的。在Microsoft Visual studio 6.0中,
M i c r o s o f t的調試程式支持一個非常有用的特性,即可以配置 Wa t c h視窗,以便始終都能顯示線
程的最後錯誤代碼的號碼和該錯誤的英文描述。通過選定 Wa t c h視窗中的一行,並鍵入
“@ e r r, h r”,就能夠做到這一點。觀察圖1 - 1,你會看到已經調用了C r e a t e F i l e函式。該函式返回
I N VA L I D _ H A N D L E _ VA L U E(- 1)的H A N D L E,表示它未能打開指定的檔案。但是Wa t c h視窗
向我們顯示最後錯誤代碼(即如果調用 G e t L a s t E r r o r函式,該函式返回的錯誤代碼)是
0 x 0 0 0 0 0 0 0 2。該Wa t c h視窗又進一步指明錯誤代碼2是指“系統不能找到指定的檔案。”你會發
現它與Wi n E r r o r. h頭檔案中的錯誤代碼2所指的字元串是相同的。
圖1-1 在Visual Studio 6.0的Wa t c h視窗中鍵入
“@ e r r, h r”,就可以查看當前執行緒的最後錯誤代碼

F o r m a t M e s s a g e函式的功能實際上是非常豐富的,在創建向用戶顯示的字元串信息時,它
是首選函式。該函式之所以有這樣大的作用,原因之一是它很容易用多種語言進行操作。該函
數能夠檢測出用戶首選的語言(在Regional Settings Control Panel小應用程式中設定),並返回
相應的文本。當然,首先必須自己轉換字元串,然後將已轉換的訊息表資源嵌入你的 . e x e檔案
或D L L模組中,然後該函式會選定正確的嵌入對象。 E r r o r S h o w示例應用程式(本章後面將加
以介紹)展示了如何調用該函式,以便將M i c r o s o f t公司定義的錯誤代碼轉換成它的文本描述。
有些人常常問我,M i c r o s o f t公司是否建立了一個主控列表,以顯示每個Wi n d o w s函式可能
返回的所有錯誤代碼。可惜,回答是沒有這樣的列表,而且 M i c r o s o f t公司將永遠不會建立這樣
的一個列表。因為在創建系統的新版本時,建立和維護該列表實在太困難了。
建立這樣一個列表存在的問題是,你可以調用一個 Wi n d o w s函式,但是該函式能夠在內部
調用另一個函式,而這另一個函式又可以調用另一個函式,如此類推。由於各種不同的原因,
這些函式中的任何一個函式都可能運行失敗。有時,當一個函式運行失敗時,較高級的函式對
它進行恢復,並且仍然可以執行你想執行的操作。為了創建該主控列表, M i c r o s o f t公司必須跟
蹤每個函式的運行路徑,並建立所有可能的錯誤代碼的列表。這項工作很困難。而且,當創建
系統的新版本時,這些函式的運行路徑還會改變。
1.1 定義自己的錯誤代碼
前面已經說明 Wi n d o w s函式是如何向函式的調用者指明發生的錯誤,你也能夠將該機制用
於自己的函式。比如說,你編寫了一個希望其他人調用的函式,你的函式可能因為這樣或那樣
的原因而運行失敗,你必須向函式的調用者說明它已經運行失敗。
若要指明函式運行失敗,只需要設定執行緒的最後的錯誤代碼,然後讓你的函式返回FA L S E、
I N VA L I D _ H A N D L E _ VA L U E、N U L L或者返回任何合適的信息。若要設定執行緒的最後錯誤代
碼,只需調用下面的代碼:
請將你認為合適的任何3 2位號碼傳遞給該函式。嘗試使用 Wi n E r r o r. h中已經存在的代碼,

相關詞條

相關搜尋

熱門詞條

聯絡我們