程式設計師必讀

程式設計師必讀

《程式設計師必讀》是2000年機械工業出版社出版的圖書,作者是(美)JeffreyRichter(J.理查特)。

基本介紹

  • 中文名:Windows核心編程
  • 作者:(美)Jeffrey Richter(J.理查特)
  • 譯者:王建華
  • 出版時間:2000年5月1日
  • 出版社:機械工業出版社
  • ISBN:9787111079453
  • 裝幀:平裝(帶盤)
  • 第一部分:程式設計師必讀
第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 DB O O L 如果函式運行失敗,那么返回值是0,否則返回的是非0值。最好對返回值進行測試,以確定它是0還是非0。不要測試返回值是否為T R U EH 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 DP 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中已經存在的代碼,

相關詞條

熱門詞條

聯絡我們