大家好,如果您還對c語言句柄的用法不太了解,沒有關(guān)系,今天就由本站為大家分享c語言句柄的用法的知識,包括c語言中handle的用法的問題都會給大家分析到,還望可以解決大家的問題,下面我們就開始吧!
什么是文件句柄
這是操作系統(tǒng)里的一個概念,句柄是WONDOWS用來標識被應(yīng)用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標識諸如應(yīng)用程序?qū)嵗翱冢刂疲粓D,GDI對象等等。
WINDOWS句柄有點象C語言中的文件句柄。從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。
從數(shù)據(jù)類型上來看它只是一個16位的無符號整數(shù)。
應(yīng)用程序幾乎總是通過調(diào)用一個WINDOWS函數(shù)來獲得一個句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內(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)存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。
Windows內(nèi)存管理器在移動對象在內(nèi)存中的位置后,把對象新的地址告知這個句柄地址來保存。
這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內(nèi)存中的哪個位置。
這個地址是在對象裝載(Load)時由系統(tǒng)分配給的,當系統(tǒng)卸載時(Unload)又釋放給系統(tǒng)。
句柄地址(穩(wěn)定)→記載著對象在內(nèi)存中的地址----→對象在內(nèi)存中的地址(不穩(wěn)定)→實際對象本質(zhì):WINDOWS程序中并不是用物理地址來標識一個內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWSAPI給這些項目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統(tǒng)不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數(shù)情況的確不一樣的。
假如我們把進入電影院看電影看成是一個應(yīng)用程序的啟動運行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
C語言中的HANDLE怎么使用
除了各種API函數(shù)之外,句柄(HANDLE)沒有使用必要。
當一個函數(shù)要求句柄作為參數(shù)時,如果不是強調(diào)屬性的函數(shù),傳遞一個NULL就行了。
否則以WinMain作為主函數(shù),將主調(diào)函數(shù)的基礎(chǔ)參數(shù)hInstance作為句柄傳入。
對于一個只懂C語言得人來說,怎么理解句柄
句柄是一個序號,它不是一個內(nèi)存地址。 它用于管理Windows內(nèi)核對象,比如用戶打開一個文件,Windows即會建立一個文件內(nèi)核對象,所謂內(nèi)核對象就是一塊內(nèi)存結(jié)構(gòu),里面有文件路徑,文件大小,當前文件指針等等信息。Windows系統(tǒng)會打開很多的文件,因此就有很多的文件內(nèi)核對象,同樣Windows系統(tǒng)還會建立其它的類型的很多很多的內(nèi)核對象。如何管理這么多的內(nèi)核對象呢?Windows通過建立一個叫做句柄表的東西,用于記錄內(nèi)核對象的地址。表中每一個元素,都是一個內(nèi)核對象的起始地址,然后給每一個對象對應(yīng)一個序號,此序號即為句柄。 //句柄表類似于下面的結(jié)構(gòu),像0、1、2這樣的序號即為句柄----------------------------------------------------0第一個內(nèi)核對象的地址1第二個內(nèi)核對象的地址2第三個內(nèi)核對象的地址----------------------------------------------------
Java的句柄是什么意思
句柄是系統(tǒng)分配給你操作文件的權(quán)限,你操作所有的文件都需要用到系統(tǒng)分配給你的句柄.比如說
FileInputStreamfin=newFileInputStream("c:\123.txt");
fin就是你申請后,系統(tǒng)分配給你c:\123.txt的句柄.你通過FIN來調(diào)用這個文件.
句柄到底是什么句柄的分類
句柄就是個數(shù)字,一般和當前系統(tǒng)下的整數(shù)的位數(shù)一樣,比如32bit系統(tǒng)下就是4個字節(jié)。這個數(shù)字是一個對象的唯一標示,和對象一一對應(yīng)。這個對象可以是一個塊內(nèi)存,一個資源,或者一個服務(wù)的context(如socket,thread)等等。這個數(shù)字的來源可以有很多中,只要能保證和它代表的對象保持唯一對應(yīng)就可以,比如可以用內(nèi)存地址,也可以用句柄表的序號,或者干脆用一個自增ID,再或者用以上的值去異或一個常數(shù)。
傳統(tǒng)上操作系統(tǒng)內(nèi)核和系統(tǒng)服務(wù)API都是C語言接口的,但是其內(nèi)部設(shè)計理念上又是OO的,所以有對象概念卻沒有對應(yīng)的語言語法支持。句柄的作用就是在C語言環(huán)境下代替C++的對象指針來用的。
創(chuàng)建句柄就是構(gòu)造,銷毀句柄就是析構(gòu),用句柄調(diào)用函數(shù)相當于傳入this指針。如果有系統(tǒng)API是C++接口的,那么就沒有句柄了,而是某個接口指針,IXXXPtr之類的,比如Windows的comptr。
OK,關(guān)于c語言句柄的用法和c語言中handle的用法的內(nèi)容到此結(jié)束了,希望對大家有所幫助。