2011-04-11 89 views
16

可能重複:
What is a Windows Handle?
What exactly is 「handle」 ?什麼是「手柄」?

我看到引用窗口處理,控制其有一個窗口的引用手柄等,但我不不知道手柄是什麼。

我特別想知道它是什麼,以及任何與.NET相關的相關細節。

+0

這是http://stackoverflow.com/questions/902967/what-is-a-windows-handle的副本,其中,儘管沒有一個公認的答案並提供信息您正在尋找。 – 2011-04-11 05:12:56

+0

可能的重複:http://stackoverflow.com/questions/902967/what-is-a-windows-handle – ChrisWue 2011-04-11 05:13:31

+3

句柄不是.NET的東西。他們是Windows的東西。 – BoltClock 2011-04-11 05:14:00

回答

9

句柄是操作系統的參考。它沒有編程參考的語義,但它所做的是讓系統資源知道你在API調用中傳遞的內容。

通常,HANDLE被封裝在一個類的實例中。 CWnd是一個很好的例子,它包含一個HWND,它是窗口句柄。

你可以這樣做。 CWnd * pWnd = CWnd :: FromHandle(hWnd)注意:CWnd :: FromHandle(hWnd)是靜態的,不需要實例。

它會傳回包裝hWnd的包裝。不太好!如果句柄實際上沒有被對象包裝,它將創建一個,它只會是臨時的,所以一旦使用它然後將其扔掉。它可以創建實例,因爲hWnd在其結構中有足夠的信息來實例化一個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 claa。

瞭解更多:http://wiki.answers.com/Q/What_is_a_handle_in_Windows_Programming#ixzz1JBmoF0lv

1

句柄是唯一標識操作系統對象的東西,無論是套接字,同步原語等(在Unix中它們通常被稱爲描述符)。從技術上講,它可以是全局對象表中的偏移量,也可以是包含對象信息的記錄指針。但是你需要把這個句柄當作一個不透明的數字。

.NET使用對象的引用,所以在.NET中,當涉及到與OS的互操作時,您遇到了處理問題。

5

句柄是由另一方(通常是OS)提供給您的某些資源的抽象引用,您可以交回引用該資源。

操作系統通常包含一個句柄表,其中包含用戶創建的實體(打開文件,...);該句柄是該表中的整數索引。你的進程是開放的,操作系統在它的句柄表中創建一個條目,用你的(進程)名稱標記它,然後把這個條目的索引交給你的進程。當你的進程想要進行讀操作時,它向操作系統提供句柄整數,操作系統通過簡單地將它作爲表索引在表中查找;它現在知道您的進程想要讀取哪個實體(文件)。

通過將您的進程ID放入句柄條目中,操作系統可以判斷該句柄是否對進程有效。你的過程可以提供垃圾作爲操作系統的句柄;如果句柄槽匹配,操作系統將做你想要的,不管它有多愚蠢。畢竟,它的你的資源。