單從概念上講,句柄指一個
目標的標識,而指針是一個目標的內(nèi)存首地址。從實際處理的角度講,即能夠把句柄界說為指針,又能夠把它界說為同類目標數(shù)組的索引,這兩種處理辦法都有優(yōu)缺點,至于選用哪種方式,完全應(yīng)該看實際需求,這能夠說是一種程序設(shè)計上的技巧。那種單純以為句柄是指針或索引的主意都是機械的、不切當?shù)摹?/div>
其實,在Windows中類似的處理是許多的、很靈活的。再舉個相似的例子:
咱們知道,在Windows中有個函數(shù)叫做CallWindowProc。望文生義,它的效果就是向指定的窗口過程傳遞一個消息。你或許會想,已然我現(xiàn)已有了窗口過程的指針,為什么我不能夠直接通過這個指針調(diào)用該函數(shù)(這是C語言的內(nèi)建功能)?事實上,在Win16中確實能夠這么做,因為GetWindowLong回來的確實是該函數(shù)的指針。但在Win32下,GetWindowLong回來的并不是該函數(shù)的指針,而是一個包括函數(shù)指針的數(shù)據(jù)結(jié)構(gòu)的指針(MSDN上說回來的是一個窗口函數(shù)地址或它的句柄,就是指的這種情況)。該數(shù)據(jù)結(jié)構(gòu)是可變的,但只需你運用CallWindowProc來調(diào)用的話是不會犯錯的。這兒咱們又看到運用句柄處理帶來的優(yōu)點。(補充闡明一點:微軟在這兒之所以這么處理,是為了處理16位/32位以及ANSI/UNICODE的轉(zhuǎn)化問題)
解疑
界說
句柄是什么?
在windows中,句柄是和目標一一對應(yīng)的32位無符號整數(shù)值。目標能夠映射到唯
一的句柄,句柄也能夠映射到唯一的目標。
用途
為什么咱們需求句柄?
更準確地說,是windows需求句柄。windows需求向程序員供給必要的編程接口
,在這些接口中,答應(yīng)程序員拜訪、創(chuàng)立和銷毀目標�?墒牵鲇诜庋b地考慮,wi
ndows并不想向程序員回來指針。指針包括了太多的信息。首先指針給出了目標存儲
確實切位置;其次,要操作一個指針,程序員必須知道指針所指目標的內(nèi)部結(jié)構(gòu)特
征,也即,windows必須向程序員露出相應(yīng)的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)或許是操作
體系想向程序員隱藏的。
假如說COM技能向用戶隱藏了數(shù)據(jù),只露出了接口并只答應(yīng)按接口界說的辦法操
作數(shù)據(jù)的話,句柄這種方式則答應(yīng)你按自己的方式直接操作數(shù)據(jù),但windows又不向
你直接露出數(shù)據(jù)。直接操作數(shù)據(jù)是程序員需求的,不露出數(shù)據(jù)是windows所需求的,
句柄封裝方式完成了各取所需。
映射
句柄怎么與目標映射
封裝背后,必須有一個當?shù)啬軌蛲瓿?a href="/down/5538.html">解碼,以完成句柄和目標的相互轉(zhuǎn)化。在
windows中,存在兩種映射方式:
a. 全等映射。也即,句柄自身就是一個指針。映射在這兒只是類型轉(zhuǎn)化而已。
這種情況有,進程實例句柄或模塊句柄,以及資源句柄等等。
b. 根據(jù)表格的映射。這是目標指針與句柄之間最普通的映射機制。操作體系創(chuàng)
建表格,并保存一切要考慮的目標。需求創(chuàng)立新目標時,要先在表格中找到空進口
,然后把表示目標的數(shù)據(jù)添入其中。當目標被刪除時,它的數(shù)據(jù)成員和其在表中的
進口被釋放。
完成
句柄的界說和完成
咱們以GDI目標為例進行討論。創(chuàng)立了GDI目標,就會得到該目標的句柄。句柄
的目標或許是HBRUSH、HPEN、HFONT或HDC中的一種,這依賴于你創(chuàng)立 的GDI目標類
型�?墒亲钇胀ǖ腉DI目標類型是HGDIOBJ。HGDIOBJ被界說成空指針。
HPEN的實際編譯類型界說隨編譯時間宏STRICT的不同而不同。假如STRCIT現(xiàn)已
被界說了,HPEN是這樣的:
12下一頁>