當前位置:編程學習大全網 - 行動軟體 - 句柄是壹個什麽類型的值?

句柄是壹個什麽類型的值?

句柄是壹種特殊的智能指針。

句柄,是整個Windows編程的基礎。壹個句柄是指使用的壹個唯壹的整數值,即壹個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例,諸如,壹個窗口,按鈕,圖標,滾動條,輸出設備,控件或者文件等。應用程序能夠通過句柄訪問相應的對象的信息,但是句柄不是壹個指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無用處的。

句柄是Windows用來標誌應用程序中建立的或是使用的唯壹整數,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)。

語句:

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2條語句都是對的,表達的是壹個意義。

壹個WINDOWS應用程序可以用不同的方法獲得壹個特定項的句柄。許多API函數,諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是壹個句柄值。另外,WINDOWS也能通過應用程序的引出函數將壹個句柄作為參數傳送給應用程序,應用程序壹旦獲得了壹個確定項的句柄,便可在WINDOWS環境下的任何地方對這個句柄進行操作。其實句柄的大量使用已經影響到了每壹個WINDOWS的程序設計。

壹個句柄,只有當唯壹地確定了壹個項目的時候,它才開始有意義。句柄對應著項目表中的壹項,而只有WINDOWS本身才能直接存取這個表,應用程序只能通過API函數來處理不同的句柄。舉個例子來說吧,比如:我們可以為我們的應用程序申請壹塊內存塊,通過調用API函數GlobalAlloc,來返回壹個句柄值:

hMem=GlobalAlloc(......);

現在的hMem是個索引值

不是物理地址,應用程序還不能直接存取這塊內存。這兒還有壹句題外話,是關於操作系統的內存管理的。壹般情況下操作系統給應用程序分配的內存塊都是可以被移動的或者是可以丟棄的,這樣能使有限的內存資源得到充分利用。所以,我們剛開始分配到的那塊內存的地址是不確定的,因為它是可以被移動的,所以得先鎖定那塊內存塊,這裏應用程序需要調用API函數GlobalLock函數來鎖定句柄。如下:

lpMem=GlobalLock(hMem);

這樣應用程序才能存取這塊內存。

作用:

句柄是壹個標識符,是拿來標識對象或者項目的。

如果想更透徹壹點地認識句柄,我可以告訴大家,句柄類似指向指針的指針,僅僅是類似,通過句柄可以找到對應的數據,但是不是二級指針。我們知道,所謂指針是壹種內存地址。應用程序啟動後,組成這個程序的各對象是駐留在內存中的。簡單地理解,似乎我們只要獲知這個內存的首地址,就可以隨時用這個地址訪問對象了。如果您真的這樣認為,那您可就大錯特錯了。我們知道,Windows是壹個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,以此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裏去找那壹個對象呢?

為了解決這個問題,Windows操作系統為全體應用程序騰出壹些內存單元,用來專門登記各應用程序的對象在內存中的地址的變化,而前者的物理地址在系統運行期間是始終保持不變的。Windows內存管理器移動了對象在內存中的位置後,會把該對象新的地址及時地告知給對應的句柄進行更新。這樣我們只要知道這個句柄,就可以間接地知道對象具體在內存中的哪個位置了。這個地址是在對象裝載(Load)時由系統分配給的,當對象卸載時(Unload)又釋放給系統。

  • 上一篇:神印王座講了什麽故事啊?
  • 下一篇:韓劇下載哪個app好
  • copyright 2024編程學習大全網