控制代碼詳解,什麼是控制代碼?控制代碼有什麼用?

2021-09-20 12:54:49 字數 1646 閱讀 5698

最近在做專案時遇到了控制代碼的概念,之前只知道在編譯原理裡有控制代碼的概念,在實際的程式設計時會經常用到控制代碼。

這裡需要說明:

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

執行緒控制代碼有什麼用

今天溫習很久前寫的 發現自己寫的這麼一句 m htheard createthread null,0,regnotifyproc,lpvoid this 0,null closehandle m htheard 突然給糊塗了,剛建立的執行緒,為什麼有close了,還是當初入門不踏實,沒有細想,現在反...

什麼是控制代碼

控制代碼是wondows用來標識被應用程式所建立或使用的物件的唯一整數,windows使用各種各樣的 控制代碼標識諸如應用程式例項,視窗,控制,位圖,gdi物件等等。windows 控制代碼有點象c語言中的檔案 控制代碼。從上面的定義中的我們可以看到,控制代碼是乙個識別符號,是拿來標識物件或者專案的...

什麼是控制代碼?

控制代碼就是編好的程式exe或dll在被windows系統呼叫時,windows給這些程式進駐電腦記憶體空間所分配的乙個編號 記憶體位址 windows中幾乎所有的東西都是用控制代碼來標識的,檔案控制代碼 視窗控制代碼 執行緒控制代碼和模組控制代碼等。控制代碼位址是乙個程式進駐電腦記憶體的起始位址。...