| 
    就是一個指針   在32位windows中占用4個字節(jié)
 它指向內(nèi)存的尺寸由它的類型決定
 函數(shù)用句柄來傳遞數(shù)據(jù)
   
    句柄在winnt.h中是這么定義的:   #ifdef   STRICT
 typedef   void   *HANDLE;
 #define   DECLARE_HANDLE(name)   struct   name##__   {   int   unused;   };   typedef   struct   name##__   *name
 #else
 typedef   PVOID   HANDLE;
 #define   DECLARE_HANDLE(name)   typedef   HANDLE   name
 #endif
 
 STRICT修飾符的意思是變量類型是否要求嚴(yán)格定義。在這里,我們可以看到HANDLE其實(shí)就是一個void類型的指針。這樣有什么用呢?學(xué)過c/c++語言的人都知道,void類型的指針可以通過強(qiáng)制類型轉(zhuǎn)換變?yōu)槿魏晤愋偷闹羔?,使用最靈活。
 
 在很多情況下,句柄是一個對象的指針,或者說是地址,一個對象的地址。比如對于分配的一個內(nèi)存塊(對象),它的句柄就是它的首地址,這沒什么問題。
 
 但是這并不總是成立的,對于沒有對象意義的句柄尤其如此。這就取決與系統(tǒng)的定義了。比如系統(tǒng)鉤子的類型HHOOK,說它是地址就沒有任何意義。對于窗口句柄也是如此。在這些情況下,我們可以把句柄理解為某事物在系統(tǒng)該類事物列表中的ID。
 
 是不是加點(diǎn)分呀?我從來沒回答過50分以下的題目。:)
   
    句柄是對象的索引,這樣隱藏了危險的地址信息,同時也使系統(tǒng)對象和應(yīng)用程序隔離。    
    句柄,你可以把他想象成一個把子,讓別人來拎的把子.至于怎么來拎,是操作系統(tǒng)的事情   
 句柄不是指針,作為內(nèi)核對象他是系統(tǒng)一個內(nèi)核對象指針的索引.可以間接的認(rèn)為他是指針的指針.
 
 呵呵,說不清楚,關(guān)鍵是不同的句柄,有不同的處理方法
 
 你需要知道的是如何得到一個句柄,然后保存他,在需要的地方把他作為參數(shù)傳給函數(shù)就可以了,具體是什么其實(shí)不需要知道:)
   
    在32位Windows中,“句柄不是指針”這句話已經(jīng)不再成立了,比如GlobalAlloc()等內(nèi)存分配函數(shù)返回的句柄實(shí)際就是該內(nèi)存的地址。因此才不需要使用GlobalLock()來鎖定句柄以得到地址。這些東西n年以前在MSDN中就說明了。   
 事實(shí)上,有實(shí)際對象意義的東西(占用一段存儲器),比如上面說的內(nèi)存的句柄基本就是地址。其它沒有對象意義的東西是系統(tǒng)索引。這些你只要看看Windows的那幾個頭文件就能理解了。
 
 說句題外話,如果沒有看過Windows標(biāo)準(zhǔn)頭文件和MFC源程序就不能算是真正的Windows程序員。撐死是一個合格的c/c++程序員。
 |