【问题标题】:What is a "handle"? [duplicate]什么是“把手”? [复制]
【发布时间】:2011-08-02 18:50:47
【问题描述】:

可能的重复:
What is a Windows Handle?
What exactly is “handle” ?

我看到了对窗口 handle 的引用,以及对窗口 handle 的引用的控件等。但我不知道句柄是什么。

我特别想知道它是什么以及任何相关细节,因为它与 .NET 相关。

【问题讨论】:

标签: c# .net definition handle


【解决方案1】:

句柄是对另一方(通常是操作系统)提供给您的某些资源的抽象引用,您可以将其交还给另一方以引用该资源。

操作系统通常包含一个句柄表,其中包含用户创建的实体(打开的文件、创建的信号量、进程、线程……);句柄是(通常实现为)该表的整数索引。您的进程打开,操作系统在其句柄表中创建一个条目,用您的(进程)名称标记它,并将该条目的索引交回您的进程。当您的进程想要进行读取时,它会向操作系统提供句柄整数,操作系统只需将其用作表索引即可在表中查找它;它现在知道您的进程要从哪个实体(文件)读取。

通过将您的进程 ID 放在句柄条目中,操作系统可以判断句柄是否对进程有效。您的进程可以提供垃圾作为操作系统的句柄;如果句柄插槽匹配,操作系统会做你想做的事,不管它有多愚蠢。毕竟,它的你的资源。

【讨论】:

    【解决方案2】:

    句柄是操作系统的参考。它没有编程引用的语义,但它的作用是让系统资源在 API 调用中传递它时知道您所指的是什么。

    通常,HANDLE 被包装在一个类的实例中。 CWnd 就是一个很好的例子,它包含一个 HWND,它是一个窗口句柄。

    你可以这样做。 CWnd *pWnd = CWnd::FromHandle(hWnd) 注意:CWnd::FromHandle(hWnd) 是静态的,不需要实例。

    它会将 hWnd 被包装的包装器传回给你。不完全是!如果句柄实际上没有被对象包裹,它将创建一个并且它只会是临时的。所以使用它一次然后扔掉它。它可以创建实例,因为 hWnd 在其结构中有足够的信息供 Windows 实例化 CWnd 对象。它不会将它添加到句柄 v 对象表中,因此它只是临时的。

    HWND 实际上是一个内核对象,还有更多?

    • HWND(CWnd 和 CWnd 派生类)
    • HDC(CDC 和 CDC 派生类)
    • HMENU(C菜单)
    • HPEN (CGdiObject)
    • HBRUSH (CGdiObject)
    • HFONT (CGdiObject)
    • HBITMAP (CGdiObject)
    • HPALETTE (CGdiObject)
    • HRGN (CGdiObject)
    • HIMAGELIST (CImageList)
    • SOCKET (CSocket)(应该是 HSOCKET?)
    • 等。

    如果需要,我不确定所有这些是否会传回一个临时对象。 GetDC(hWnd) 会从 hWnd 获得一个 hDC,但这将是暂时的,使用 CDC 类可能更好。

    阅读更多:http://wiki.answers.com/Q/What_is_a_handle_in_Windows_Programming#ixzz1JBmoF0lv

    【讨论】:

      【解决方案3】:

      句柄是唯一标识操作系统对象的东西,可以是套接字、同步原语等(在 Unix 中它们通常称为描述符)。从技术上讲,它要么是全局对象表中的偏移量,要么是指向包含对象信息的记录的指针。但是您需要将此句柄视为一个不透明的数字。

      .NET 使用对对象的引用,因此在 .NET 中,当涉及到与操作系统的互操作时,您会遇到句柄。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-28
        • 2023-03-17
        • 2022-01-05
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 2015-06-26
        • 2011-07-07
        相关资源
        最近更新 更多