句柄是什麼?

所謂句柄實際上是一個數據,是一個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,  這樣,可實現隱藏細節。  
---------------------------------------------------------------  

總的來說句柄類就是一個非繼承的類,目的就是爲了屏蔽一個類層次結構很多類.  
 
也就是說你操作一個句柄類就可以控制一個屬於類層次結構具體類,這樣你就以同一的接口消除了層次結構的不同,而且可以把資源控制等很多底層的操作放在具體實現類上面而句柄類對於用戶來說不存在這樣複雜的問題,用戶只需要用句柄類提供的簡單接口就可以了.  
---------------------------------------------------------------  
 
就是某個對象的指針,  
通過句柄就可以引用該對象。


原文地址:http://blog.chinaunix.net/uid-20071539-id-1978403.html
發佈了47 篇原創文章 · 獲贊 43 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章