為什麼 HANDLE 返回值不同

2021-05-24 05:21:59 字數 1048 閱讀 6375

如果你注意各種返回 handle 值的函式,你會發現它們有些返回 null (如 createthread) 而有些則返回 invalid_handle_value(如 createfile)。你不得不查詢文件找出每種函式在失敗時返回什麼。

為什麼返回值不統一?

如你所猜測,是歷史原因。

這些值是用於相容16位 windows。16位函式 opengfile, _lopen 和 _lcreate 在失敗的時候返回-1。因此32位 createfile 函式返回 invalid_handle_value 以便於從 win16 中移植**.

(基於此,你可以回答下面的問題:為什麼我呼叫 createfile 而實際上並不是建立乙個文?為什麼不呼叫 openfile?答案是:是,openfile 是個更好的名字,但這個名字已經被用了。)

另一方面,沒有與 win16 等價的 createthread 或 createmutex,因此它們返回 null。

因為前已經設定了不統一的返回值,無論什麼時候增加乙個新函式,就有點難以確定新函式返回 null 或者 invalid_handle_value。

這種不統一有幾個後果。

第一,當然,你不得不小心地適時檢查函式的返回值。

第二,這意味著如果你寫乙個通用的控制代碼封裝類,你必須留意兩個可能的「非控制代碼」值。

第三,如果你想預先初始化乙個控制代碼變數,你必須初始化它為乙個與你將用的值相容。如,下面的**是錯誤的:

**有兩個bug。首先,從 createfile 返回值的檢查不正確。上面的**檢查 null 而不是 invalid_handle_value。其次,**初始化 h 變數不正確。下面是正確的版本:

第四,你必須非常小心地對待 invalid_handle_value 值:偶然地,invalid_handle_value 恰好等於 getcurrentprocess() 返回的偽控制代碼。許多核心函式接受偽控制代碼,因此如果你不幸地偶然呼叫了,那麼,waitforsingleobject 乙個 invalid_handle_value 控制代碼,而事實上你在等待自已的程序,這個等待,顯而易見,決不能因為程序退出時發出訊號完成,因此你將等待你自己終止它。

為什麼建構函式沒有返回值?

意見 1 我認為建構函式隱含的返回值就是this,因為建構函式是在類的物件產生時自動呼叫。建構函式被呼叫也就意味著產生了乙個物件,而this指標是與物件實體相關聯的,所以我認為它返回的就是this。舉例如下 class a a aa 此語句導致類a的建構函式a 被自動呼叫返回乙個首位址,系統就在記憶...

有返回值和無返回值函式

前面在定義函式時,有些函式使用了return語句,有些函式沒有使用return語句,使用return語句與不使用return語句有什麼區別呢?由前面的章節我們知道,若定義函式時沒有使用return語句,則預設返回乙個none。要返回乙個none,可以只寫乙個return,但要返回具體的數值,就需要在...

函式失敗返回 為什麼控制代碼返回值不一致?

如果檢視返回handle的各種函式,你就會發現其中一些返回null 例如createthread 而另一些會返回invalid handle value 例如createfile 所以,你必須檢視相關的msdn文件,才能確定函式在執行失敗時的返回值的意義。可能你早就猜到了 因為歷史原因。這些控制代碼...