什么是句柄,句柄有什么作用
對(duì)于“句柄”,在下一直停留在一知半解的認(rèn)識(shí)層面,近日在下學(xué)習(xí)Windows編程,決定趁此機(jī)會(huì)將句柄徹底搞清楚。查閱了一些網(wǎng)絡(luò)上的資料,發(fā)現(xiàn)網(wǎng)絡(luò)上的講解大概可以分為兩類:一種是以比喻、類比的方式說明,這種方法雖然形象易懂,但并沒有從原理上、本質(zhì)上加以揭示,讓人仍然想問“為什么?”、“怎么實(shí)現(xiàn)?”。另一種是給出源代碼,無可厚非,這當(dāng)然是最本質(zhì)的說明了,但這樣一來,又顯得不夠直觀,初學(xué)者理解起來有一定的難度。鑒于此,在下盡微末之能,結(jié)合自己的愚見,在兩者之間折中,用圖解的方式來將原理呈現(xiàn)出來,做到一目了然。
這里需要說明:
1.這里將句柄所能標(biāo)識(shí)的所有東西(如窗口、文件、畫筆等)統(tǒng)稱為“對(duì)象”。
2.圖中一個(gè)小橫框表示一定大小的內(nèi)存區(qū)域,并不代表一個(gè)字節(jié),如標(biāo)有0X00000AC6的橫框表示4個(gè)字節(jié)。
3.圖解的目的是為了直觀易懂,所以不一定與源碼完全對(duì)應(yīng),會(huì)有一定的簡化。
讓我們先看圖,再解釋。
其中,
圖1是程序運(yùn)行到某時(shí)刻時(shí)的內(nèi)存快照,
圖2是程序往后運(yùn)行到另一時(shí)刻時(shí)的內(nèi)存快照。紅色部分標(biāo)出了兩次的變化。
簡單解釋:
Windows是一個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng),很多時(shí)候,進(jìn)程的代碼和數(shù)據(jù)并不全部裝入內(nèi)存,
進(jìn)程的某一段裝入內(nèi)存后,還可能被換出到外存,當(dāng)再次需要時(shí),再裝入內(nèi)存。
兩次裝入的地址絕大多數(shù)情況下是不一樣的。
也就是說,同一對(duì)象在內(nèi)存中的地址會(huì)變化。(對(duì)于虛擬內(nèi)存不是很了解的讀者,可以參考有關(guān)操作系統(tǒng)方面的書籍)
那么,程序怎么才能準(zhǔn)確地訪問到對(duì)象呢?
為了解決這個(gè)問題,Windows引入了句柄。
系統(tǒng)為每個(gè)進(jìn)程在內(nèi)存中分配一定的區(qū)域,用來存放各個(gè)句柄,
即一個(gè)個(gè)32位無符號(hào)整型值(32位操作系統(tǒng)中)。每個(gè)32位無符號(hào)整型值相當(dāng)于一個(gè)指針,指向內(nèi)存中的另一個(gè)區(qū)域(我們不妨稱之為區(qū)域A)。
而區(qū)域A中存放的正是對(duì)象在內(nèi)存中的地址。當(dāng)對(duì)象在內(nèi)存中的位置發(fā)生變化時(shí),區(qū)域A的值被更新,變?yōu)楫?dāng)前時(shí)刻對(duì)象在內(nèi)存中的地址,而在這個(gè)過程中,區(qū)域A的位置以及對(duì)應(yīng)句柄的值是不發(fā)生變化的。
這種機(jī)制,用一種形象的說法可以表述為:有一個(gè)固定的地址(句柄),指向一個(gè)固定的位置(區(qū)域A),而區(qū)域A中的值可以動(dòng)態(tài)地變化,它時(shí)刻記錄著當(dāng)前時(shí)刻對(duì)象在內(nèi)存中的地址。
這樣,無論對(duì)象的位置在內(nèi)存中如何變化,只要我們掌握了句柄的值,就可以找到區(qū)域A,進(jìn)而找到該對(duì)象。而句柄的值在程序本次運(yùn)行期間是絕對(duì)不變的,我們(即系統(tǒng))當(dāng)然可以掌握它。這就是以不變應(yīng)萬變,按圖索驥,順藤摸瓜。
所以,我們可以這樣理解Windows句柄
數(shù)值上,是一個(gè)32位無符號(hào)整型值(32位系統(tǒng)下);
邏輯上,相當(dāng)于指針的指針;形象理解上,是Windows中各個(gè)對(duì)象的一個(gè)唯一的、固定不變的ID;作用上,Windows使用句柄來標(biāo)識(shí)諸如窗口、位圖、畫筆等對(duì)象,并通過句柄找到這些對(duì)象。
下面,關(guān)于句柄,再交代一些關(guān)鍵性細(xì)節(jié):
**1.**所謂“唯一”、“不變”是指在程序的一次運(yùn)行中。如果本次運(yùn)行完,關(guān)閉程序,再次啟動(dòng)程序運(yùn)行,那么這次運(yùn)行中,同一對(duì)象的句柄的值和上次運(yùn)行時(shí)比較,一般是不一樣的。
其實(shí)這理解起來也很自然,所謂“一把歸一把,這把是這把,那把是那把,兩者不相干”(“把”是形象的說法,就像打牌一樣,這里指程序的一次運(yùn)行)。
**2.**句柄是對(duì)象生成時(shí)系統(tǒng)指定的,屬性是只讀的,程序員不能修改句柄。
**3.**不同的系統(tǒng)中,句柄的大小(字節(jié)數(shù))是不同的,可以使用sizeof()來計(jì)算句柄的大小。
**4.**通過句柄,程序員只能調(diào)用系統(tǒng)提供的服務(wù)(即API調(diào)用),不能像使用指針那樣,做其它的事。
**
寫在后面:
**
到此為止,有關(guān)Windows句柄就簡單介紹到這里。需要說明的是,本文是面向初學(xué)者的,旨在讓讀者對(duì)句柄有一個(gè)完整而清晰的認(rèn)知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源碼的艱難晦澀。因此,本文并不能做到絕對(duì)的直達(dá)本質(zhì),同時(shí)也可能在個(gè)別細(xì)節(jié)上與真實(shí)情況稍有出入,但在下認(rèn)為這并不貽害初學(xué)者對(duì)句柄的認(rèn)識(shí)。因?yàn)閷?duì)某一知識(shí)的認(rèn)知,從幾乎一無所知或是一知半解到“精通”,往往需要更多新知識(shí)的補(bǔ)充,短時(shí)間內(nèi)很難達(dá)到,在不影響知識(shí)的使用的前提下,先把握整體,在逐步深入細(xì)節(jié),不失為一個(gè)明智的選擇
總結(jié)
以上是生活随笔為你收集整理的什么是句柄,句柄有什么作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2008 R2
- 下一篇: Jade的使用教程