功能上的理解:
什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你與操作系統(tǒng)打交道的東東。 舉個通俗的例子,比如你考上了大學(xué),入學(xué)后,學(xué)校(操作系統(tǒng))會給你一個學(xué)生證號。注意,這個號碼是學(xué)校指定的,你無法自選。有了這個號碼(學(xué)生證,假設(shè)一證多用)享受學(xué)校提供的服務(wù): 如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。
但你不能到食堂里買啤酒,因為學(xué)校不允許這種服務(wù)。而在計算機中系統(tǒng)提供的服務(wù)就是API調(diào)用,你有了HANDLE,就可以理直氣壯地向系統(tǒng)提出調(diào)用API的服務(wù)。而指針的權(quán)力就大多了,有了指針你可以到處去喝酒,打架,學(xué)校(操作系統(tǒng))管不著,所以句柄和指針的區(qū)別在于句柄指針調(diào)用系統(tǒng)提供的服務(wù)。而句柄雖然是一個能相互區(qū)別的號碼,但與我們普通的ID號又有區(qū)別,
普通的ID號是可以由程序員自己定義的,而句柄不行,它是對象生成是系統(tǒng)指定的,是為了區(qū)別系統(tǒng)中存在的各個對象,這個句柄不是由程序員符給的。
概念上的理解
1。句柄,是整個windows編程的基礎(chǔ),一個句柄是指使用的一個唯一的整數(shù)值,是指一個四字節(jié)長的數(shù)值,用于標(biāo)志應(yīng)用程序中的不同對象和同類對象中的不同的實例,諸如,一個窗口,按鈕,圖標(biāo),滾動條,輸出設(shè)備,控件或者文件等。應(yīng)用程序能夠通過句柄訪問相應(yīng)的對象的信息。
2。句柄不是一個指針,程序不能利用它句柄來直接閱讀文件中的信息。如果句柄不用在I/O文件中,它是毫無用處的。
3。句柄是windows用來標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù),windows使用了大量的句柄來來標(biāo)志很多對象。
機制上的理解
前面的分析很經(jīng)典,但我認為有一點必須指出的。如果不對,請各位指證。句柄是指針,一點不假,但是這個指針又與C中的指針有不同之處。因為Windows是一個多任務(wù)的系統(tǒng),其內(nèi)存是可以移動的,這樣的話如果某一時刻有一個指針指向一塊內(nèi)存,之后的某個時刻卻被系統(tǒng)移走了,如果你再用這個指針的話就會出錯。為了解決這一問題,windows在系統(tǒng)專區(qū)開一塊內(nèi)存用于存放句柄,這個句柄的值就是一個地址,當(dāng)這一塊內(nèi)存被移走后,windows就修改這個句柄的值,再訪問這塊內(nèi)存時,句柄的值總是有效的。正因為這樣當(dāng)你使用GlobalAlloc分配的內(nèi)存時,如果你指定這塊內(nèi)存的屬性是固定的,那么它的返回值可以直接給一個指針,如果是可以移動的,返回值就必須給一個句柄,你就必須先GlobalLock后才能使用。這是我對句柄理解,不知道對不對?
我的理解
其實,句柄是一個指向指針的指針。即:在windows程序設(shè)計中,句柄僅是一個應(yīng)用程序用來識別某些事情的數(shù)字
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知 道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動后,組成這個程序的各對象是住留在內(nèi)的 。如果簡單地理解,似乎我們只要獲知這個內(nèi)存的首地址,那么就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,依此來滿足各種應(yīng)用程序的內(nèi)存需要。對象被移動意味著它的地址變化 了。如果地址總是如此變化,我們該到哪里去找該對象呢? 為了解決這個問題,Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存儲地址,用來專門 登記各應(yīng)用對象在內(nèi)存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。 Wi ndows內(nèi)存管理器在移動對象在內(nèi)存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內(nèi)存中的哪個位置。這個地址是在對象裝載(Load)時由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(Unload)又釋放給系統(tǒng) 。
句柄地址(穩(wěn)定)→記載著對象在內(nèi)存中的地址→對象在內(nèi)存中的地址(不穩(wěn)定) →實際對象 但是,必須注意的是程序每次從新啟動,系統(tǒng)不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數(shù)情況的確不一樣的。假如我們把進入電影院看電影看成是一個應(yīng)用程序的啟動運行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。