有没有一个有效的句柄?
.NET Framework中有SafeHandleZeroOrMinusOneIsInvalid
类,以及SafeHandleMinusOneIsInvalid
类。有没有一个有效的句柄?
这是为什么?在哪种情况下零有效句柄?
作为关于其他答案的附加讲座,请参阅this OldNewThing blog entry关于不一致的句柄返回值。
你应该详细说明,而不只是通过一个链接。 – tenfour
你完全正确。如果您认为缺少任何东西,请随时编辑我的答案。事实上,我甚至应该把它作为评论发布,因为它不完全回答这个问题。但我会错过我的十点:D。此外,我不想阻止任何人发现雷蒙德的精彩博客(我只可能复制从那里文本,这似乎是浪费时间给我) – MartinStettner
@MartinStettner:这是一个公认的良好的联系,但是,这并不说关于.NET包装器的任何事情,也就是为什么'SafeHandleMinusOneIsInvalid'完全存在。无论如何+1,但我怀疑我会接受这一点。 :P – Mehrdad
由于提出通过微软在其documentation(和Joshua,在描述证明)它是依赖于实现,可以这么说:
它描述无效句柄的格式。
例如,一些 手柄使用-1作为无效句柄值,而其他人使用0。进一步 此类的派生(例如,文件或注册表句柄)可以 专门进一步。有关从SafeHandleZeroOrMinusOneIsInvalid派生的类的示例 ,请参阅SafeFileHandle类。
我想你的名字太多了:这意味着一些API按照约定返回0表示失败,其他返回-1。对于返回-1的API,这并不意味着0将是一个有效的句柄,只是API返回-1来指示失败。
所以这实际上是API通常用来指示失败的值;它没有说任何其他句柄值对于任何给定的API集是否有效。
也许,但那么怎么没有一个'SafeHandleZeroIsInvalid'类?当然,还有很多API会返回零作为无效值而不是-1? – Mehrdad
关键问题是相同的句柄类需要与* both *类型的API一起工作。在这种情况下,“Zero *或* Minus One”意味着*两个*都被认为是无效的,而不是*或*或*。这允许与CreateMutex(在失败时返回NULL)相同的基类与CreateFile API一起使用(在失败时返回INVALID_HANDLE_VALUE)。为什么有两个独立的基类(如果用户选错了基类,会导致混淆和错误),以便能够处理这两种情况? – BrendanMcK
我会想象,今天零不是一个有效的句柄;现在我正在使用Windows 7的Process Explorer查看并处理值从4开始(有趣的是,Image File Execution Options注册表项)。我怀疑它是在某个古老的Win16或DOS函数打开文件的时候,可能会返回值为零的句柄或描述符。今天,0和-1是特殊的无效值,所以我无法想象你会得到一个有效的值与任何值。您可以检查哪些.NET API使用SafeHandleMinusOneIsInvalid;也许这会给你一些提示。 – Luke
@Luke:也许...但即使如此,当他们在.NET 2.0中设计SafeHandle时,他们为什么会关心Win16/DOS呢? – Mehrdad
可能没有直接链接,但一切都建立在一切之上,所以向后兼容性是一个重要的考虑因素。你知道.NET 2.0在Windows 98上运行;当你想到这件事时,这有点令人印象深刻。 – Luke