句柄与指针的区别
句柄實(shí)際上是一種指向某種資源的指針,但與指針又有所不同:指針對應(yīng)著一個數(shù)據(jù)在內(nèi)存中的地址,得到了指針就可以自由地修改該數(shù)據(jù)。
Windows并不希望一般程序修改其內(nèi)部數(shù)據(jù)結(jié)構(gòu),因?yàn)檫@樣太不安全。所以Windows給每個使用GlobalAlloc等函數(shù)聲明的內(nèi)存區(qū)域指定一個句柄(本質(zhì)上仍是一個指針,但不要直接操作它),平時你只是在調(diào)用API函數(shù)時利用這個句柄來說明要操作哪段內(nèi)存。當(dāng)你需要對某個內(nèi)存進(jìn)行直接操作時,可以使用GlobalLock鎖住這段內(nèi)存并獲得指針來直接進(jìn)行操作。??
?“句柄”(handle),handle的本意是把柄,把手的意思。是你與操作系統(tǒng)打交道的東西。舉個例子:比如你做了虧心事(我說的是比如,呵呵),不幸讓我抓住了把柄,那么我讓你做什么你就得做什么,因?yàn)槟愕陌驯谖疫@。
我們編程的時候也是這樣,比如我們要想操縱一個窗口,那我們就必須“抓住它的把柄”,只有這樣,我們才能改變它的屬性,改變它的式樣,甚至銷毀它(狠了點(diǎn)兒)。
我們再引用一個通俗一點(diǎn)的例子,比如你考上了大學(xué),入學(xué)后,學(xué)校(操作系統(tǒng))會給你一個學(xué)生證號。注意,這個號碼是學(xué)校指定的,你無法自選。有了這個號碼(學(xué)生證,假設(shè)一證多用)就可以享受學(xué)校提供的服務(wù):如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂里買啤酒,因?yàn)閷W(xué)校不允許這種服務(wù)。
而在計(jì)算機(jī)中系統(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)中存在的各個對象,這個句柄不是由程序員賦給的。實(shí)際應(yīng)用中,最常用的就是文件句柄和窗口句柄。例如,窗口句柄的值是一個長整數(shù),每個窗體都用一個句柄來表示。所以句柄是不會重復(fù)的,很多的函數(shù)都會用到窗體的句柄。
總結(jié)
- 上一篇: Systemd基础篇:systemd v
- 下一篇: 魔兽世界忘记账号角色服务器,魔兽世界里我