MFC中的句柄

1.引出句柄程序員

CDC問題:
1.CDC dc;dc.LineTo(point);沒法運行函數

2.CDC *dc=GetDC();dc->LineTo(point);就能夠運行了操作系統

MFC中有大量的句柄包裝類。所謂句柄包裝類,指的是這些類是封裝了系統對象的句柄,並提供了一組成員函數做爲訪問系統對象的接口。指針

從這些句柄包裝類的意義上能夠看出,一個被徹底構造好,處於良好狀態的MFC對象,其中的句柄成員必須是有效的,才能正常使用那些成員函數來操做這個對象。對象

因此通常的MFC句柄包裝類的構建要完成兩個任務:接口

第一,建立一個句柄包裝類對象。內存

第二,初始化其中的系統對象句柄。資源

大部分的包裝類對象的構建都一般分爲兩步進行:內存管理

一、建立一個對象;基礎

二、經過create等相似的成員函數建立系統對象並初始化對象中的句柄。

固然這兩部分也能夠直接在構造函數中完成。此時通常須要一個系統對象句柄做爲參數,或者另外一個被良好構造的句柄包裝類對象作參數,以在構造函數中就能初始化句柄成員。其餘方法還有經過Attach和Detach將部

分構造的對象和系統對象句柄綁定,或經過FromHandle得到一個臨時的句柄包裝類對象等。

如今問題就很清晰了:

CDC dc;dc.LineTo( point );//沒法運行,是由於dc這個對象僅僅被部分構建,其中的系統對象句柄成員並無賦值爲一個有效的繪圖設備句柄,天然其後的LineTo調用就會失敗。

而:

CDC *dc = GetDC();dc->LineTo( point );/*經過調用窗口類的GetDC()成員函數,將返回一個被良好構造的CDC對象(即該對象中的設備句柄成員已經被賦值爲一個有效的

                                                             句柄),因此其後的LineTo操做就沒問題。也就是問題的關鍵不在於對象建立於棧仍是堆中,而在因而否徹底構造好了一個句柄包裝

                                                             類對象。*/

2.句柄究竟是什麼東東呢,指針呢?

  其實,句柄並無什麼神奇之處,無論哪一種句柄,實際都是一個整數。它標識一種資源,如窗口、位圖等等。就象你找一我的,必須知道它的地址同樣,若是你要操做一種資源,必須先得到句柄。「取窗口句柄

()」並非只能取出窗口的句柄,全部窗口控件,如編輯框、標籤等均可以用本命令取出本身的句柄,如:編輯框1.取窗口句柄()或標籤1.取窗口句柄()。控件的句柄一樣,任何控件都有它自身的特有屬性,句柄

也就指它的特有屬性(包括共性)。

  句柄英文譯做HANDLE,HANDLE的本意是把柄,把手的意思,是與操做系統打交道的東東。有人舉過比較通俗的例子:你考上了大學,入學後,學校(操做系統)會給你一個學生證號。注意,這個號碼是學校指

定的,你沒法自選。有了這個號碼(學生證,假設一證多用)享受學校提供的服務:如你就能夠去圖書館借書,去食堂吃飯,去教室上課等 等。但你不能到食堂裏買啤酒,由於學校不容許這種服務。而在計算機中系統

提供的服務就是API調用了。當你有了HANDLE,就能夠義正詞嚴地向系統提出調用API的服務。而指針的權力就大多了,有了指針你能夠處處去喝酒,打架,學校(操做系統)管不着,因此句柄和指針的區別在於句柄

只能調用系統提供的服務。而句柄雖然是一個能相互區別的號碼,但與咱們普通的ID號又有區別,普通的ID號是能夠由程序員本身定義的,而句柄不行,它是對象生成時系統指定的,是爲了區別系統中存在的各個對

象,這個句柄不是由程序員賦給的。

能夠引用csdn上一我的的話來講明句柄,指針對象實例之間的關係:

牧童遙指杏花村。牧童的手爲指針,杏花村的牌子爲句柄,杏花村酒店爲對象的實例。

3.深刻探討句柄

  更透徹的說,句柄是一種指向指針的指針。你們都知道,所謂指針是一種內存地址。應用程序啓動後,組成這個程序的各對象是住留在內存的。若是簡單地理解,彷佛咱們只要獲知這個內存的首地址,那麼就能夠隨

時用這個地址訪問對象。可是,若是您真的這樣認爲,那麼您就大錯特錯了。咱們知道,Windows是一個以虛擬內存爲基礎的操做系統。在這種系統環境 下,Windows內存管理器常常在內存中來回移動對象,依此來

知足各類應用程序的內存須要。對象被移動意味着它的地址變化了。若是地址老是如此變化,咱們該到哪裏去找該對象呢? 爲了解決這個問題,Windows操做系統爲各應用程序騰出一些內存儲地址,用來專門登記各應

用對象在內存中的地址變化,而這個地址(存儲單元的位置)本 身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣咱們只需記住這個句柄地址就能夠間接地

知道對象具體在內存中的哪一個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。句柄地址(穩定) ─→記載着對象在內存中的地址─→對象在內存中的地址(不穩定) ─→實際

對象

本質:WINDOWS程序中並非用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配肯定的句柄,並將句柄返回給應用程序,而後經過句柄來進行操做。 可是

必須注意的是程序每次重新啓動,系統不能保證分配給這個程序的句柄仍是原來的那個句柄,並且絕大多數狀況的確不同的。假如咱們把進入電影院看電影看 成是一個應用程序的啓動運行,那麼系統給應用程序分配

的句柄老是不同,這和每次電影院售給咱們的門票老是不一樣的一個座位是同樣的道理。

相關文章
相關標籤/搜索