句柄的做用



 在<<WINDOWS編程短平快>>(南京大學出版社)一書中是這麼說的:句柄是WONDOWS用來標識被應用程序所創建或使用的對象的惟一整數,WINDOWS使用各類各樣的句柄標識諸如應用程序實例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。 
程序員

<<Microsoft Windows 3 Developer's Workshop>>(Microsoft Press,by Richard Wilton)一書中句柄的概念是這樣的:在Windows環境中,句柄是用來標識項目的,這些項目包括:模塊(module)、任務(task)、實例(instance)、文件(file)、內存塊(block of memory)、菜單(menu)、控制(control)、字體(font)、資源(resource),包括圖標(icon),光標(cursor),字符串(string)等、GDI對象(GDI object),包括位圖(bitmap),畫刷(brush),元文件(metafile),調色板(palette),畫筆(pen),區域(region),以及設備描述表(device context)。 

   從上面的兩個定義中咱們能夠看到,句柄其實是一個標識符,是用來標識對象或者項目的,句柄是一個 32 位的正整數,Microsoft® Windows® 用它來識別窗體或其餘對象,例如字體或位圖。應用程序幾乎老是經過調用一個WINDOWS函數來得到一個句柄,以後其餘的WINDOWS函數就可使用這個句柄,以引用相應的對象。在WINDOWS編程中會用到大量的句柄,好比:HINSTANCE(實例句柄),HBITMAP(位圖句柄),HDC(設備描述表句柄),HICON(圖標句柄)等等,這當中還有一個通用的句柄HANDLE。 

    一個WINDOWS應用程序能夠用不一樣的方法得到一個特定項的句柄。許多API函數,諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個句柄值。另外,WINDOWS也能經過應用程序的引出函數將一個句柄做爲參數傳送給應用程序,應用程序一旦得到了一個肯定項的句柄,即可在WINDOWS環境下的任何地方對這個句柄進行操做。 

    說的確切一點,句柄其實是一種指向某種資源的指針,但與指針又有所不一樣:指針對應着一個數據在內存中的地址,獲得了指針就能夠自由地修改該數據。Windows並不但願通常程序修改其內部數據結構,由於這樣太不安全。因此Windows給每一個使用GlobalAlloc等函數聲明的內存區域指定一個句柄(本質上還是一個指針,但不要直接操做它),平時你只是在調用API函數時利用這個句柄來講明要操做哪段內存。當你須要對某個內存進行直接操做時,可使用GlobalLock鎖住這段內存並得到指針來直接進行操做。 

   「句柄」(handle),handle的本意是把柄,把手的意思。是你與操做系統打交道的東西。舉個例子:好比你作了虧心事(我說的是好比,呵呵),不幸讓我抓住了把柄,那麼我讓你作什麼你就得作什麼,由於你的把柄在我這。咱們編程的時候也是這樣,好比咱們要想操縱一個窗口,那咱們就必須「抓住它的把柄」,只有這樣,咱們才能改變它的屬性,改變它的式樣,甚至銷燬它(狠了點兒)。咱們再引用一個通俗一點的例子,好比你考上了大學,入學後,學校(操做系統)會給你一個學生證號。注意,這個號碼是學校指定的,你沒法自選。有了這個號碼(學生證,假設一證多用)就能夠享受學校提供的服務:如你就能夠去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裏買啤酒,由於學校不容許這種服務。而在計算機中系統提供的服務就是API調用,你有了HANDLE,就能夠義正詞嚴地向系統提出調用API的服務。而指針的權力就大多了,有了指針你能夠處處去喝酒,打架,學校(操做系統)管不着,因此句柄和指針的區別在於句柄只能調用系統提供的服務。而句柄雖然是一個能相互區別的號碼,但與咱們普通的ID號又有區別,普通的ID號是能夠由程序員本身定義的,而句柄不行,它是對象生成時系統指定的,是爲了區別系統中存在的各個對象,這個句柄不是由程序員賦給的。實際應用中,最經常使用的就是文件句柄和窗口句柄。例如,窗口句柄的值是一個長整數,每一個窗體都用一個句柄來表示。因此句柄是不會重複的,不少的函數都會用到窗體的句柄。 

    到如今,我想你應該對「句柄」這個概念更加理解了吧,說歸說,這只是我的的理解,要想真正更深入的理解,仍是要去看一下MSDN的解釋,那纔是真正的權威 

 
編程

相關文章
相關標籤/搜索