我看到对窗口句柄的引用,控件引用了一个窗口句柄等等。但我不知道句柄是什么。
我特别想知道它是什么,以及与.NET有关的任何相关细节。
答案 0 :(得分:12)
句柄是操作系统的参考。它没有编程引用的语义,但它所做的是允许系统资源知道在API调用中传递的内容。
通常,HANDLE包含在类的实例中。 CWnd就是一个很好的例子,它包含一个HWND,它是窗口的句柄。
你可以这样做。 CWnd * pWnd = CWnd :: FromHandle(hWnd)注意:CWnd :: FromHandle(hWnd)是静态的,不需要实例。
它将传回包含hWnd的包装器。好吧不太好!如果句柄实际上没有被对象包裹,它将创建一个并且它只能是临时的。所以使用它一次然后扔掉它。它可以创建实例,因为hWnd在其struct的结构中有足够的信息来实例化CWnd对象。它不会将它添加到句柄v对象表中,因此它只是临时的。
HWND实际上是一个内核对象,还有更多?
我不确定如果需要,所有这些都会传回一个临时对象。 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的互操作时,会遇到句柄。