控制代碼(handle)是乙個是用來標識物件或者專案的識別符號,可以用來描述窗體、檔案等,值得注意的是控制代碼不能是常量
。handle:控制代碼,是windows用來表示物件的(不是c++的物件),hwnd是其中一種,hwnd是handle,但handle不只是hwnd,handle是乙個通用控制代碼表示,hwnd是乙個專用表示視窗的控制代碼。更具體的可查詢msdn。包含在winnt.h標頭檔案中。
windows之所以要設立控制代碼,根本上源於記憶體管理機制的問題,即虛擬位址。簡而言之資料的位址需要變動,變動以後就需要有人來記錄、管理變動,因此系統用控制代碼來記載資料位址的變更。在程式設計中,控制代碼是一種特殊的智慧型指標,當乙個應用程式要引用其他系統(如資料庫、作業系統)所管理的記憶體塊或物件時,就要使用控制代碼。windows是乙個以虛擬記憶體為基礎的作業系統,很多時候,程序的**和資料並不全部裝入記憶體,程序的某一段裝入記憶體後,還可能被換出到外存,當再次需要時,再裝入記憶體。兩次裝入的位址絕大多數情況下是不一樣的。也就是說,同一物件在記憶體中的位址會變化。(對於虛擬記憶體不是很了解的讀者,可以參考有關作業系統方面的書籍)那麼,程式怎麼才能準確地訪問到物件呢?為了解決這個問題,windows引入了控制代碼。
系統為每個程序在記憶體中分配一定的區域,用來存放各個控制代碼,即乙個個32位無符號整型值(32位作業系統中)。每個32位無符號整型值相當於乙個指標,指向記憶體中的另乙個區域(我們不妨稱之為區域a)。而區域a中存放的正是物件在記憶體中的位址。當物件在記憶體中的位置發生變化時,區域a的值被更新,變為當前時刻物件在記憶體中的位址,而在這個過程中,區域a的位置以及對應控制代碼的值是不發生變化的。這種機制,用一種形象的說法可以表述為:有乙個固定的位址(控制代碼),指向乙個固定的位置(區域a),而區域a中的值可以動態地變化,它時刻記錄著當前時刻物件在記憶體中的位址。這樣,無論物件的位置在記憶體中如何變化,只要我們掌握了控制代碼的值,就可以找到區域a,進而找到該物件。而控制代碼的值在程式本次執行期間是絕對不變的,我們(即系統)當然可以掌握它。這就是以不變應萬變,按圖索驥,順藤摸瓜。
所以,我們可以這樣理解windows控制代碼:
數值上,是乙個32位無符號整型值(32位系統下);邏輯上,相當於指標的指標;形象理解上,是windows中各個物件的乙個唯一的、固定不變的id;作用上,windows使用控制代碼來標識諸如視窗、位圖、畫筆等物件,並通過控制代碼找到這些物件。
下面,關於控制代碼,再交代一些關鍵性細節:
1.所謂「唯一」、「不變」是指在程式的一次執行中。如果本次執行完,關閉程式,再次啟動程式執行,那麼這次執行中,同一物件的控制代碼的值和上次執行時比較,一般是不一樣的。
其實這理解起來也很自然,所謂「一把歸一把,這把是這把,那把是那把,兩者不相干」(「把」是形象的說法,就像打牌一樣,這裡指程式的一次執行)。
2.控制代碼是物件生成時系統指定的,屬性是唯讀的,程式設計師不能修改控制代碼。
3.不同的系統中,控制代碼的大小(位元組數)是不同的,可以使用sizeof()來計算控制代碼的大小。
4.通過控制代碼,程式設計師只能呼叫系統提供的服務(即api呼叫),不能像使用指標那樣,做其它的事。
控制代碼(handle)是c++程式設計中經常提及的乙個術語。它並不是一種具體的、固定不變的資料型別或實體,而是代表了程式設計中的乙個廣義的概念。控制代碼一般是指獲取另乙個物件的方法——乙個廣義的指標,它的具體形式可能是乙個整數、乙個物件或就是乙個真實的指標,而它的目的就是建立起與被訪問物件之間的惟一的聯絡。
在c++中,要訪問乙個物件,通常可以建立乙個指向物件的指標。但是在很多具體的應用中,直接用指標代表物件並不是乙個好的解決方案。
控制代碼是windows系統中物件或例項的標識,這些物件包括模組、應用程式例項、視窗、控制、位圖、gdi物件、資源、檔案等。
從資料型別上來看,它只是乙個16位的無符號整數。應用程式總是通過呼叫windows api獲得乙個控制代碼,之後其他 windows函式就可以使用該控制代碼,以引用和操作相應的核心物件。控制代碼可以像指標那樣置空,那樣控制代碼就沒有任何意義,不代表任何核心物件。
控制代碼在 windows程式設計中是乙個很重要的概念,在 windows程式中並不是用實體地址來標識乙個記憶體塊、檔案、任務或動態裝入模組的。相反地,windows api給這些專案分配確定的控制代碼,並將控制代碼返回給應用程式,然後通過控制代碼來進行操作。
應該明白的是,控制代碼是乙個識別符號,是用來標識物件或者專案的。從資料型別上來看它只是乙個16位的無符號整數。應用程式幾乎總是通過呼叫乙個windows函式來獲得乙個控制代碼,之後其他的windows函式就可以使用該控制代碼,以引用相應的物件。在 windows程式設計中會用到大量的控制代碼。
控制代碼可以給我們帶來如下的好處:
1、我們可以在實現中用尺寸大小固定的(constant-sized)物件來表示尺寸大小不定的(variable-sized)值。
2、我們可以在實現中用執行時繫結(run-time bounding)而不是編譯時(compile-timebounding)繫結的方式來處理物件。
3、對於實現的改變通常只會引起一次重新鏈結,而不是重新編譯。
4、我們可以對他人隱藏物件的實現。
在早期的windows應用程式中,控制代碼的使用是很頻繁的。但隨著mfc類庫發展,其對windows核心的封裝程度不斷提高。這樣如果用mfc類庫程式設計的話,就很少會有機會直接對控制代碼進行操作。但是如果使用 windows api函式的話,依然需要對控制代碼進行直接操作 。
在windows系統中,控制代碼分為三大類:kernelhandle、userhandle和應用程式自定義的handle。kernelhandle實際上是程序內kernel物件的指標表索引,kernel物件包括程序、檔案、訊號等。但是ms為了掩蓋著一事實,在系統啟動時生成了乙個所謂obsfucator的值(其實應該是obfuscator(混淆器),microsoftbugs(r):),生成handle後將handle與這個值異或後返回給應用程式,所以看到的handle都是一些很大而且毫無意義的數字。這些handle和索引的物件是由krnl32.dll和vmm32.vxd共同管理的,所以稱之為kernelhandle。
userhandle是用來標示視窗、dc等物件的,他們是真實的指標,但指向的並不是物件的開頭,有乙個偏移量。同樣,這些物件是由user32.dll管理的。第三種handle不過是應用程式自定義的一些索引之類的東東,具體的意義和應用程式相關。
windows控制代碼本質上就是乙個指向結構體的指標(define strict的情況下)。
struct hwnd__
;
int unused的作用就是使控制代碼指向乙個4位元組的記憶體,以便將來控制代碼指向物件的位址時能夠順利「轉化」。而從始至終,unused從來沒有被顯式地使用過,所以取名為unused。顯然,這裡unused的意思是「未被使用的」,而非「沒用的」。 控制代碼是什麼?
控制代碼是乙個指向指標的指標,我們知道,指標中儲存的是記憶體位址。那麼乙個指向指標的指標,它儲存的就是另乙個指標的位址,我們可以通過乙個指標來找到另乙個指標,再通過另乙個指標訪問到具體的資料,那麼為什麼要這麼麻煩呢?我們知道,當執行乙個占用大量記憶體的程式時,系統記憶體很快就會被填滿,這時 wind...
控制代碼是什麼
一 控制代碼定義 控制代碼就是個數字,一般和當前系統下的整數的位數一樣,比如32bit系統下就是4個位元組。這個數字是乙個物件的唯一標示,和物件一一對應。這個物件可以是乙個塊記憶體,乙個資源,或者乙個服務的context 如 socket,thread 等等。這個數字的 可以有很多中,只要能保證和它...
Linux 控制代碼是什麼
1.控制代碼就是乙個識別符號,只要獲得物件的控制代碼,我們就可以對物件進行任意的操作。2.控制代碼不是指標,作業系統用控制代碼可以找到一塊記憶體,這個控制代碼可能是識別符號,map的key,也可能是指標,看作業系統怎麼處理的了。fd算是在某種程度上替代控制代碼吧 linux 有相應機制,但沒有統一的...