为什么要使用IntPtr来处理句柄?

10
使用PInvoke时,我注意到我们需要使用`IntPtr`来引用Windows句柄。我想知道为什么不能只使用`int`来表示句柄?我的理解是句柄只是一个整数值。

7
你正在犯导致x64不兼容最常见的错误。 - SLaks
5
没错,它们是整数值。但是没有人说它们必须是32位的… - user541686
4个回答

18

Windows句柄被定义为本地机器指针大小的整数。这是为了让它们在需要时可以秘密地成为指针。(句柄可能不是指针,但如果操作系统实现者认为有必要,则允许它成为指针。出于安全考虑,它们通常实际上不是指针; 如果它们实际上是指针,人们就很容易滥用系统。)

C#中定义的int是32位整数,在64位机器上过小。IntPtr被定义为可以容纳机器大小指针的整数。这就是为什么在与句柄交互时总是使用IntPtr。


10

处理句柄是指针大小值。

在64位平台上,它们的宽度为8个字节。


1
我会说“指针大小”而不是“指针”(尽管我猜在严格的C/C++意义上,这并不太准确,因为句柄被typedef为一个指针,而size_t并不一定是指针的大小)...但如果它们是表中的索引,那么它们很可能被用作整数。但是,我明白你的意思。 - user541686

4

句柄的大小取决于机器体系结构(32位/64位)。IntPtr会处理这个问题。


2

句柄实质上是系统级指针,而指针不会隐式转换为int类型。它本身就是一种类型。因此,在.NET中有IntPtr来表示句柄类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接