什么是“手柄”?

时间:2011-04-11 05:10:06

标签: c# .net definition handle

  

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

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

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

3 个答案:

答案 0 :(得分:12)

句柄是操作系统的参考。它没有编程引用的语义,但它所做的是允许系统资源知道在API调用中传递的内容。

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

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

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

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

  • HWND(CWnd和CWnd派生类)
  • HDC(CDC和CDC派生类)
  • HMENU(CMenu)
  • 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

答案 1 :(得分:5)

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

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

通过将您的进程ID放在句柄条目中,操作系统可以判断句柄是否对进程有效。您的流程可以提供垃圾作为操作系统的句柄;如果句柄槽匹配,操作系统将执行您想要的操作,无论它多么愚蠢。毕竟,它的你的资源。

答案 2 :(得分:1)

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

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