2011-10-10 105 views
8

.NET Framework中有SafeHandleZeroOrMinusOneIsInvalid類,以及SafeHandleMinusOneIsInvalid類。有沒有一個有效的句柄?

這是爲什麼?在哪種情況下零有效句柄?

+0

我會想象,今天零不是一個有效的句柄;現在我正在使用Windows 7的Process Explorer查看並處理值從4開始(有趣的是,Image File Execution Options註冊表項)。我懷疑它是在某個古老的Win16或DOS函數打開文件的時候,可能會返回值爲零的句柄或描述符。今天,0和-1是特殊的無效值,所以我無法想象你會得到一個有效的值與任何值。您可以檢查哪些.NET API使用SafeHandleMinusOneIsInvalid;也許這會給你一些提示。 – Luke

+0

@Luke:也許...但即使如此,當他們在.NET 2.0中設計SafeHandle時,他們爲什麼會關心Win16/DOS呢? – Mehrdad

+0

可能沒有直接鏈接,但一切都建立在一切之上,所以向後兼容性是一個重要的考慮因素。你知道.NET 2.0在Windows 98上運行;當你想到這件事時,這有點令人印象深刻。 – Luke

回答

6

作爲關於其他答案的附加講座,請參閱this OldNewThing blog entry關於不一致的句柄返回值。

+0

你應該詳細說明,而不只是通過一個鏈接。 – tenfour

+0

你完全正確。如果您認爲缺少任何東西,請隨時編輯我的答案。事實上,我甚至應該把它作爲評論發佈,因爲它不完全回答這個問題。但我會錯過我的十點:D。此外,我不想阻止任何人發現雷蒙德的精彩博客(我只可能複製從那裏文本,這似乎是浪費時間給我) – MartinStettner

+0

@MartinStettner:這是一個公認的良好的聯繫,但是,這並不說關於.NET包裝器的任何事情,也就是爲什麼'SafeHandleMinusOneIsInvalid'完全存在。無論如何+1,但我懷疑我會接受這一點。 :P – Mehrdad

3

是的。零是stdin的文件句柄。如果爲零,則非內核句柄無效。

+0

http://en.wikipedia.org/wiki/File_descriptor – mellamokb

+3

Win32文件句柄與POSIX/C文件描述符不同 – jalf

+0

將0傳遞給ReadFile仍會讀取STDIN。 – Joshua

3

由於提出通過微軟在其documentation(和Joshua,在描述證明)它是依賴於實現,可以這麼說:

它描述無效句柄的格式。

例如,一些 手柄使用-1作爲無效句柄值,而其他人使用0。進一步 此類的派生(例如,文件或註冊表句柄)可以 專門進一步。有關從SafeHandleZeroOrMinusOneIsInvalid派生的類的示例 ,請參閱SafeFileHandle類。

+0

有趣的是,這使得SafeFileHandle *錯誤*。 – Joshua

+2

這還不能說當零是**有效**作爲句柄... – Mehrdad

1

我想你的名字太多了:這意味着一些API按照約定返回0表示失敗,其他返回-1。對於返回-1的API,這並不意味着0將是一個有效的句柄,只是API返回-1來指示失敗。

所以這實際上是API通常用來指示失敗的值;它沒有說任何其他句柄值對於任何給定的API集是否有效。

+0

也許,但那麼怎麼沒有一個'SafeHandleZeroIsInvalid'類?當然,還有很多API會返回零作爲無效值而不是-1? – Mehrdad

+1

關鍵問題是相同的句柄類需要與* both *類型的API一起工作。在這種情況下,「Zero *或* Minus One」意味着*兩個*都被認爲是無效的,而不是*或*或*。這允許與CreateMutex(在失敗時返回NULL)相同的基類與CreateFile API一起使用(在失敗時返回INVALID_HANDLE_VALUE)。爲什麼有兩個獨立的基類(如果用戶選錯了基類,會導致混淆和錯誤),以便能夠處理這兩種情況? – BrendanMcK

相關問題