【问题标题】:Why using IntPtr for handle?为什么使用 IntPtr 作为句柄?
【发布时间】:2012-02-28 11:23:15
【问题描述】:

在使用 PInvoke 时,我注意到我们需要使用 IntPtr 来引用 Windows 句柄。我想知道为什么不直接使用int 作为句柄?我对句柄的理解是它只是一个整数值。

【问题讨论】:

  • 您犯了导致 x64 不兼容的最常见错误。
  • 当然,它们是整数值。但是没有人说它们必须是 32 位...

标签: c# .net winapi c++-cli window-handles


【解决方案1】:

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

C# 中定义为 32 位整数的 int,在 64 位机器上太小了。 IntPtr 被定义为一个整数,它可以保存机器大小的指针。这就是为什么在与句柄互操作时总是使用 IntPtr。

【讨论】:

    【解决方案2】:

    句柄是指针大小的值。

    在 64 位平台上它们是 8 字节宽。

    【讨论】:

    • 我会说“pointer-sized”而不是“pointer”(尽管我猜在严格的 C/C++ 意义上,这不太准确,因为句柄是typedef'd 作为指针好吧,size_t 不一定是指针的大小)......但如果它们是表的索引,它们很可能被用作整数。但是,是的,重点。
    【解决方案3】:

    句柄的大小取决于机器架构(32/64 位)。 IntPtr 会解决这个问题。

    【讨论】:

      【解决方案4】:

      句柄本质上是一个系统级指针,并且指针不会隐式转换为 int。它本身就是一种类型。这就是为什么您在 .NET 中使用 IntPtr 来表示 Handle 类型的原因。

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 2019-10-28
        • 2011-07-23
        • 1970-01-01
        相关资源
        最近更新 更多