什么是句柄?指针和句柄的区别
? ? 句柄在windows編程中是一個(gè)很重要的概念,在許多地方都扮演著重要的角色。在windows環(huán)境中,句柄是用來(lái)標(biāo)識(shí)項(xiàng)目的,這些項(xiàng)目包括:
(1)模塊(module)
(2)任務(wù)(task)
(3)實(shí)例(instance)
(4)文件(file)
(5)內(nèi)存塊(block of memory)
(6)菜單(menu)
(7)控制(control)
(8)字體(font)
(9)資源(recource),包括圖標(biāo)(icon),光標(biāo)(cursor),字符串(string)等
(10)GDI對(duì)象(GDI object),包括位圖(bitmap),畫刷(brush),元文件(metafile),調(diào)色板(palette),畫筆(pen),區(qū)域(region),以及設(shè)備描述表(device context)
? ? Windows是一個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng),在這種環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來(lái)回移動(dòng)對(duì)象,以此來(lái)滿足各種應(yīng)用程序的需要。對(duì)象被移動(dòng)意味著它的地址變化了。由于地址總是如此變化,所以Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存地址,用來(lái)專門登記各應(yīng)用對(duì)象在內(nèi)存中的地址變化,而這地址(存儲(chǔ)單元的位置)本身是不變的。Windows內(nèi)存管理器在移動(dòng)對(duì)象在內(nèi)存中的位置后,把對(duì)象新的地址告知這個(gè)句柄地址來(lái)保存。這樣我們只需記住這個(gè)句柄地址就可以間接地知道對(duì)象具體在內(nèi)存中的哪個(gè)位置。這個(gè)地址是在對(duì)象裝載(Load)時(shí)由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(shí)(Unload)又釋放給系統(tǒng)。
? ?因此,Windows程序中并不是用物理地址來(lái)標(biāo)識(shí)一個(gè)內(nèi)存塊,文件,任務(wù),或動(dòng)態(tài)裝入模塊的,相反,WINDOWS API給這些項(xiàng)目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過(guò)句柄來(lái)進(jìn)行操作。
? ?在Windows編程中會(huì)用到大量的句柄,比如HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備表述句柄),HICON(圖標(biāo)句柄)等。這當(dāng)中還有一個(gè)通用的句柄,就是HANDLE,比如下面的語(yǔ)句:
1 HINSTANCE hInstance ;
2 HANDLE?hInstance ;
? 句柄地址(穩(wěn)定)->記載著對(duì)象在內(nèi)存中的地址->對(duì)象在內(nèi)存中的地址(不穩(wěn)定)->實(shí)際對(duì)象。但是,必須注意注意的是,程序每次重新啟動(dòng),系統(tǒng)不能保證分配給這個(gè)程序的句柄還是原來(lái)的那個(gè)句柄,而且絕大多數(shù)情況的確是不一樣的。
? ?而指針對(duì)應(yīng)著一個(gè)數(shù)據(jù)在內(nèi)存中的地址,得到了指針就可以自由地修改數(shù)據(jù)。Windows并不希望一般程序修改其內(nèi)部數(shù)據(jù)結(jié)構(gòu),因?yàn)檫@樣太不安全。所以Windows給每個(gè)使用GlobalAlloc等函數(shù)聲明的內(nèi)存區(qū)域指定一個(gè)句柄,句柄是一種指向指針的指針。
? 句柄和指針都是地址,不同之處在于:
(1)句柄所指的可以是一個(gè)很復(fù)雜的結(jié)構(gòu),并且很有可能是與系統(tǒng)相關(guān)的,比如說(shuō)線程的句柄,它指向的就是一個(gè)類或者結(jié)構(gòu),它和系統(tǒng)有很密切的關(guān)系。當(dāng)一個(gè)線程由于不可預(yù)料的原因而終止時(shí),系統(tǒng)就可以返回它所占用的的資料,如CPU ,內(nèi)存等。反過(guò)來(lái)想可以知道,這個(gè)句柄中的某一些項(xiàng)是與系統(tǒng)進(jìn)行交互的。由于Windows系統(tǒng)是一個(gè)多任務(wù)的系統(tǒng),它隨時(shí)都可能要分配內(nèi)存,回收內(nèi)存,重組內(nèi)存。
(2)指針也可以指向一個(gè)復(fù)雜的結(jié)構(gòu),但是通常是用戶定義的,所以必須的工作都要用戶完成,特別是在刪除的時(shí)候。
總結(jié)
以上是生活随笔為你收集整理的什么是句柄?指针和句柄的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab拟合函数参数,matlab怎
- 下一篇: 电脑用上这些壁纸站与软件,惊艳你的眼球!