handle句柄的理解


所謂句柄實際上是一個數據,是一個Long (整長型)的數據。

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,
WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,位圖
,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。

從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或
者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名
不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只
是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數
來獲得一個句柄,之后其他的WINDOWS函數就可以使用該句柄,以引用相
應的對象。

如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的
指針。我們知道,所謂指針是一種內存地址。應用程序啟動后,組成這個
程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個
內存的首地址,那么就可以隨時用這個地址訪問對象。但是,如果您真的
這樣認為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內存為
基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來
回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味着它
的地址變化了。如果地址總是如此變化,我們該到哪里去找該對象呢?

為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,
用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位
置)本身是不變的。Windows內存管理器在移動對象在內存中的位置后,把對
象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就
可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載
(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。


句柄地址(穩定)→記載着對象在內存中的地址————→對象在內存中的地
址(不穩定)→實際對象


本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務
或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,
並將句柄返回給應用程序,然后通過句柄來進行操作。


但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句
柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進
入電影院看電影看成是一個應用程序的啟動運行,那么系統給應用程序分
配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座
位是一樣的道理。


什么是句柄,有什么用?
就是指針
---------------------------------------------------------------

對於WINDOWS來說,可以是任意值
對於C++來說可以認為是封裝資源的類
---------------------------------------------------------------

句柄是個指針,但它是個二級指針(指向指針的指針).如果你擁有了一個對象
的句柄. 你就可以操作對象的所有公共方法.
---------------------------------------------------------------

handle(句柄)是服務的推廣。比如你去某快餐店吃飯,先去選餐,選完以后
付款,服務
員給你一個號,然后他就可以轉向下一位顧客。當廚房把你的餐做出來了
,廚房並不認識
你,但是每個餐上有個號,根據這個號,廚房把你的餐送到。這個號就是
handle,是服務
約定的標志。你甚至因為等煩了可以拿這個號去廚房催促。這個標志,在
一定的時間空間
內是唯一的。比如,在同樣的時間內,在該快餐店的另外一家連鎖分店可
以在為表面上相
同的號服務,但是這兩個號是分開處理的,不會張冠李戴。同樣,你吃完
飯離開該店,那
號並不會隨你離開,還會隨機地分配給后來的客戶。
handle的好處在於,你不需要管它背后是怎么實現的。它可以是用指針,也
可以是用表格
。這些完全不用你管,你也絕對不應該去關心它具體是如何實現的(當然原
理上你可以學習
技術)。因為這個技術本身就是隔絕實現和應用的直接耦合。

---------------------------------------------------------------

整型,對象的唯一標示
---------------------------------------------------------------

在32位環境中,每個程序都是獨立的,你的指針可以任意指向一個地方,但
是總是操作你這個空間的那個指針,句柄不同,你獲得了他,就可以操作
別的程序的東西。
---------------------------------------------------------------

句柄是操作系統在生成對象時分配給對象的唯一標識!
通過句柄可以獲取操作系統提供的服務!
句柄不同於指針,如果你得到一個對象的指針,那你就可以在此對象上為所欲
為!那操作系統就慘了!於是系統不給你指針,而給你一個加了限制的,用於跟蹤
對象的指針的標識——句柄!系統使用句柄向外提供服務就相對安全了!
操作系統是通過API提供服務的,對於用戶來說,句柄等同於對象指針,但
實際上句柄和指針根本不是一回事
---------------------------------------------------------------

句柄既有指針的便利性,又消除了指針缺點,比如可能delete一個無效的指

---------------------------------------------------------------

其實句柄還是很好理解,它主要用在兩個地方。
1。 減少編譯量: 通常的編譯,總是包括所有文件(*.h+*.cpp),如果你
改動的是CPP文件(而且通常是這樣), 你就要編譯包括頭文件在內的全
部文件。 如果你在頭文件中定義一個handle,你就可以在cpp中用一個指針
指向它, 編譯的時候可以避免冗長的編譯。
2。 隔離信息量:因為頭文件一般來講總是對用戶公開的,你可通過handle
將關鍵實現部分封裝在cpp中,編譯后得到的全是obj, 這樣,可實現隱藏
細節。
---------------------------------------------------------------

總的來說句柄類就是一個非繼承的類,目的就是為了屏蔽一個類層次結構很
多類.

也就是說你操作一個句柄類就可以控制一個屬於類層次結構具體類,這樣你
就以同一的接口消除了層次結構的不同,而且可以把資源控制等很多底層的
操作放在具體實現類上面而句柄類對於用戶來說不存在這樣復雜的問題,用
戶只需要用句柄類提供的簡單接口就可以了.
---------------------------------------------------------------

就是某個對象的指針,
通過句柄就可以引用該對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM