Windows控制代碼

2021-10-01 12:03:52 字數 1904 閱讀 2114

**說明——究竟什麼是windows控制代碼

參考資料:

寫在前面:

對於「控制代碼」,在下一直停留在一知半解的認識層面,近日在下學習windows程式設計,決定趁此機會將控制代碼徹底搞清楚。查閱了一些網路上的資料,發現網路上的講解大概可以分為兩類:一種是以比喻、模擬的方式說明,這種方法雖然形象易懂,但並沒有從原理上、本質上加以揭示,讓人仍然想問「為什麼?」、「怎麼實現?」。另一種是給出源**,無可厚非,這當然是最本質的說明了,但這樣一來,又顯得不夠直觀,初學者理解起來有一定的難度。鑑於此,在下盡微末之能,結合自己的愚見,在兩者之間折中,用**的方式來將原理呈現出來,做到一目了然。

這裡需要說明:

1.這裡將控制代碼所能標識的所有東西(如視窗、檔案、畫筆等)統稱為「物件」。

2.圖中乙個小橫框表示一定大小的記憶體區域,並不代表乙個位元組,如標有0x00000ac6的橫框表示4個位元組。

3.**的目的是為了直觀易懂,所以不一定與原始碼完全對應,會有一定的簡化。

讓我們先看圖,再解釋。

其中,圖1是程式執行到某時刻時的記憶體快照,圖2是程式往後執行到另一時刻時的記憶體快照。紅色部分標出了兩次的變化。

簡單解釋:

windows是乙個以虛擬記憶體為基礎的作業系統,很多時候,程序的**和資料並不全部裝入記憶體,程序的某一段裝入記憶體後,還可能被換出到外存,當再次需要時,再裝入記憶體。兩次裝入的位址絕大多數情況下是不一樣的。也就是說,同一物件在記憶體中的位址會變化。(對於虛擬記憶體不是很了解的讀者,可以參考有關作業系統方面的書籍)那麼,程式怎麼才能準確地訪問到物件呢?為了解決這個問題,windows引入了控制代碼。

系統為每個程序在記憶體中分配一定的區域,用來存放各個控制代碼,即乙個個32位無符號整型值(32位作業系統中)。每個32位無符號整型值相當於乙個指標,指向記憶體中的另乙個區域(我們不妨稱之為區域a)。而區域a中存放的正是物件在記憶體中的位址。當物件在記憶體中的位置發生變化時,區域a的值被更新,變為當前時刻物件在記憶體中的位址,而在這個過程中,區域a的位置以及對應控制代碼的值是不發生變化的。這種機制,用一種形象的說法可以表述為:有乙個固定的位址(控制代碼),指向乙個固定的位置(區域a),而區域a中的值可以動態地變化,它時刻記錄著當前時刻物件在記憶體中的位址。這樣,無論物件的位置在記憶體中如何變化,只要我們掌握了控制代碼的值,就可以找到區域a,進而找到該物件。而控制代碼的值在程式本次執行期間是絕對不變的,我們(即系統)當然可以掌握它。這就是以不變應萬變,按圖索驥,順藤摸瓜。

所以,我們可以這樣理解windows控制代碼:

數值上,是乙個32位無符號整型值(32位系統下);邏輯上,相當於指標的指標;形象理解上,是windows中各個物件的乙個唯一的、固定不變的id;作用上,windows使用控制代碼來標識諸如視窗、位圖、畫筆等物件,並通過控制代碼找到這些物件。

下面,關於控制代碼,再交代一些關鍵性細節:

1.所謂「唯一」、「不變」是指在程式的一次執行中。如果本次執行完,關閉程式,再次啟動程式執行,那麼這次執行中,同一物件的控制代碼的值和上次執行時比較,一般是不一樣的。

其實這理解起來也很自然,所謂「一把歸一把,這把是這把,那把是那把,兩者不相干」(「把」是形象的說法,就像打牌一樣,這裡指程式的一次執行)。

2.控制代碼是物件生成時系統指定的,屬性是唯讀的,程式設計師不能修改控制代碼。

3.不同的系統中,控制代碼的大小(位元組數)是不同的,可以使用sizeof()來計算控制代碼的大小。

4.通過控制代碼,程式設計師只能呼叫系統提供的服務(即api呼叫),不能像使用指標那樣,做其它的事。

寫在後面:

2.在下知識有限,理解不深,如有錯誤紕漏之處,這裡再三懇請大家一定要為在下指出。大家的批評指正是在下進步的源泉。

Windows控制代碼,訊息

常用控制代碼型別及說明 控制代碼型別 說明 hwnd 標識視窗控制代碼 hinstance 標識當前例項控制代碼 hcursor 標識游標控制代碼 hfont 標識字型控制代碼 hpen 標識畫筆控制代碼 hbrush 畫刷 hdc 裝置環境 hbitmap 位圖 hicon 圖示 hmenu 選單...

Windows核心程式設計 控制代碼和偽控制代碼

getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...

Windows核心程式設計 控制代碼和偽控制代碼

getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...