【轉載】句柄是什麼?

句柄是什麼?

1.句柄是什麼?
    在windows中,句柄是和對象一一對應的32位無符號整數值。對象能夠映射到惟
一的句柄,句柄也能夠映射到惟一的對象。
2.爲何咱們須要句柄?
    更準確地說,是windows須要句柄。windows須要向程序員提供必要地編程接口
,在這些接口中,容許程序員訪問、建立和銷燬對象。可是,出於封裝地考慮,wi
ndows並不想向程序員返回指針。指針包含了太多的信息。首先指針給出了對象存儲
的確切位置;其次,要操做一個指針,程序員必須知道指針所指對象的內部結構特
徵,也即,windows必須向程序員暴露相應的數據結構,而這些數據結構也許是操做
系統想向程序員隱藏的。
    若是說COM技術向用戶隱藏了數據,只暴露了接口並只容許按接口定義的方法操
做數據的話,句柄這種方式則容許你按本身的方式直接操做數據,但windows又不向
你直接暴露數據。直接操做數據是程序員須要的,不暴露數據是windows所須要的,
句柄封裝方式實現了各取所需。
3.句柄如何與對象映射?
    封裝背後,必須有一個地方能夠實現解碼,以實現句柄和對象的相互轉換。在
windows中,存在兩種映射方式:
    a. 全等映射。也即,句柄自己就是一個指針。映射在這裏只是類型轉換而已。
這種狀況有,進程實例句柄或模塊句柄,以及資源句柄等等。
    b. 基於表格的映射。這是對象指針與句柄之間最普通的映射機制。操做系統創
建表格,並保存全部要考慮的對象。須要建立新對象時,要先在表格中找到空入口
,而後把表示對象的數據添入其中。當對象被刪除時,它的數據成員和其在表中的
入口被釋放。
4.句柄的定義和實現
    咱們以GDI對象爲例進行討論。建立了GDI對象,就會獲得該對象的句柄。句柄
的對象多是HBRUSH、HPEN、HFONT或HDC中的一種,這依賴於你建立 的GDI對象類
型。可是最普通的GDI對象類型是HGDIOBJ。HGDIOBJ被定義成空指針。
    HPEN的實際編譯類型定義隨編譯時間宏STRICT的不一樣而不一樣。若是STRCIT已經
被定義了,HPEN是這樣的:
    struct HPEN__ {int unused};
    typedef struct HPEN__* HPEN;
    若是STRICT沒有定義,HPEN是這樣定義的:
    typedef void *HANDLE;
    typedef HANDLE HPEN;
    上面這段代碼是一個注重細節的程序員最接近句柄的地方,所以咱們重點分析
一下。這裏有一點點技巧。若是定義了STRICT宏,HPEN是指向有單個未使用字段的
結構的指針,不然HPEN是空指針。C/C++編譯器容許把任何類型的指針做爲空指什傳
遞,反之則不能夠。兩個不一樣類型的非空指針是互不兼容的。在STRICT版本中,編
譯對GDI對象句柄的不正確混用將給出警告,對於非GDI句柄,如HWND、HMENU的不正
確混用也會給出警告,從而使程序在編譯器獲得更STRICT的檢查。
    接下來的分析可能不那麼令你感興趣,但它更深入地揭示了句柄。對GDI句柄來
說,儘管windows頭文件把它定義成指針,但若是你仔細檢查這些句柄的值,它根本
就不像指針,這也是爲何我說它只是一個32位無符整數值的緣由。對句柄就是指
針的狀況,這句話也仍然適用。讓咱們隨意地生成一些句柄,好比你用GetStockOb
ject()以獲得一些句柄,你會發現,它們的值總在區間0x01900011到0xba040389。
前者指向用戶區中的未分配的無效區域,後者指向內核地址空間。另外你可能發現
,兩個句柄之間的值可能只差數值1,這也說明GDI句柄不是指針。
    和多數人想象的不同,句柄也不是一個單純的索引值。對GDI對象句柄來講,
GDI句柄由8位 、1位堆對象標記(代表對象是否建立在堆中)、7位對象類型信息和
高4位爲0的16位索引組成,如圖:
 3 3 2 2 2 2 2 2  2  2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
 1 0 9 8 7 6 5 4  3  2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|  8 位引用計數 |堆 |  對象類型7  |            16位索引           |
                 標
                 記
在這裏你能夠看到,對GDI來講,它只使用了16位做爲索引。這意味着一個進程最多隻
能夠建立小於64K個句柄,實際上受其餘一些限制,整個windwos系統中大概能夠容納約
16384(0x4000)個GDI對象。
【主要內容取自windows圖形編程,袁峯著。稍做整理,應該不影響正確性。】html

原博客地址:http://www.cnblogs.com/lihaozy/archive/2011/02/24/1963903.html

相關文章
相關標籤/搜索