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