控制代碼的理解

2021-07-07 03:44:59 字數 3698 閱讀 5722

功能上的理解:

什麼是"控制代碼"(handle),handle的本意是把柄,把手的意思。是你與作業系統打交道的東東。

舉個通俗的例子,比如你考上了大學,入學後,學校(作業系統)會給你乙個學生證號。

注意,這個號碼是學校指定的,你無法自選。

有了這個號碼(學生證,假設一證多用)享受學校提供的服務:

如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。

但你不能到食堂裡買啤酒,因為學校不允許這種服務。

而在計算機中系統提供的服務就是api呼叫,你有了handle(學校給你的卡),就可以理直氣壯地向系統提出呼叫api的服務。

而指標的權力就大多了,有了指標(相當於錢啦)你可以到處去喝酒,打架,學校(作業系統)管不著,

所以控制代碼和指標的區別在於控制代碼指標呼叫系統提供的服務(控制代碼只可以使用學校提供的服務)。

而控制代碼雖然是乙個能相互區別的號碼(每個飯卡都有乙個唯一的卡號的),但與我們普通的id號又有區別,

普通的id號是可以由程式設計師自己定義的,而控制代碼不行(必須是由學校為你安排的),它是物件生成是系統指定的,

是為了區別系統中存在的各個物件,這個控制代碼不是由程式設計師符給的。

概念上的理解

1。控制代碼,是整個windows程式設計的基礎,乙個控制代碼是指使用的乙個唯一的整數值,

是指乙個四位元組長的數值,用於標誌應用程式中的不同物件和同類物件中的不同的例項,

諸如,乙個視窗,按鈕,圖示,滾動條,輸出裝置,控制項或者檔案等。

應用程式能夠通過控制代碼訪問相應的物件的資訊。

2。控制代碼不是乙個指標,程式不能利用它控制代碼來直接閱讀檔案中的資訊。

如果控制代碼不用在i/o檔案中,它是毫無用處的。

3。控制代碼是windows用來標誌應用程式中建立的或是使用的唯一整數,

windows使用了大量的控制代碼來來標誌很多物件。

機制上的理解

前面的分析很經典,但我認為有一點必須指出的。如果不對,請各位指證。

控制代碼是指標,一點不假,但是這個指標又與c中的指標有不同之處。

因為windows是乙個多工的系統,其記憶體是可以移動的,

這樣的話如果某一時刻有乙個指標指向一塊記憶體,之後的某個時刻卻被系統移走了,

如果你再用這個指標的話就會出錯。

為了解決這一問題,windows在系統專區開一塊記憶體用於存放控制代碼,這個控制代碼的值就是乙個位址,

當這一塊記憶體被移走後,windows就修改這個控制代碼的值,再訪問這塊記憶體時,控制代碼的值總是有效的。

正因為這樣當你使用globalalloc分配的記憶體時,如果你指定這塊記憶體的屬性是固定的,

那麼它的返回值可以直接給乙個指標,如果是可以移動的,

返回值就必須給乙個控制代碼,你就必須先globallock後才能使用。

這是我對控制代碼理解,不知道對不對?

我的理解

其實,控制代碼是乙個指向指標的指標。即:

在windows程式設計中,控制代碼僅是乙個應用程式用來識別某些事情的數字

如果想更透徹一點地認識控制代碼,我可以告訴大家,控制代碼是一種指向指標的指標。

我們知 道,

所謂指標是一種記憶體位址。

應用程式啟動後,組成這個程式的各物件是駐留在內的 。

如果簡單地理解,似乎我們只要獲知這個記憶體的首位址,那麼就可以隨時用這個位址訪問物件。

但是,如果您真的這樣認為,那麼您就大錯特錯了。

我們知道,windows是乙個以虛擬記憶體為基礎的作業系統。在這種系統環境下,

windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。

物件被移動意味著它的位址變化 了。如果位址總是如此變化,我們該到**去找該物件呢?

為了解決這個問題,windows作業系統為各應用程式騰出一些內儲存位址,

用來專門 登記各應用物件在記憶體中的位址變化,而這個位址(儲存單元的位置)本身是不變的。

wi ndows記憶體管理器在移動物件在記憶體中的位置後,把物件新的位址告知這個控制代碼位址來儲存。

這樣我們只需記住這個控制代碼位址就可以間接地知道物件具體在記憶體中的哪個位置。

這個位址是在物件裝載(load)時由系統分配給的,當系統解除安裝時(unload)又釋放給系統 。

控制代碼位址(穩定)→記載著物件在記憶體中的位址→物件在記憶體中的位址(不穩定) →實際物件

但是,必須注意的是程式每次從新啟動,系統不能保證分配給這個程式的控制代碼還是

原來的那個控制代碼,而且絕大多數情況的確不一樣的。

假如我們把進入電影院看電影看成

是乙個應用程式的啟動執行,那麼系統給應用程式分配的控制代碼總是不一樣,這和每次電

影院售給我們的門票總是不同的乙個座位是一樣的道理。(每次啟動時的控制代碼都是不一樣的,

控制代碼僅僅是乙個標識)

從廣義上,能夠從乙個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是"handle",本義就是"柄",只是在電腦科學中,被特別地翻譯成"控制代碼",其實還是個"柄"。從乙個小東西拎起一大堆東西,這難道不像是個"柄"嗎?

然後,指標其實也是一種"控制代碼",只是由於指標同時擁有更特殊的含義——實實在在地對應記憶體裡地乙個位址——所以,通常不把指標說成是"控制代碼"。但指標也有著能從乙個32位的值引用到一大堆資料的作用,這不是控制代碼又是什麼?

windows系統中有許多核心物件(這裡的物件不完全等價 於"物件導向程式設計"一詞中的"物件",雖然實質上還真差不多),比如開啟的檔案,建立的執行緒,程式的視窗,等等。這些重要的物件肯定不是4個位元組或者 8個位元組足以完全描述的,他們擁有大量的屬性。為了儲存這樣乙個"物件"的狀態,往往需要上百甚至上千位元組的記憶體空間,那麼怎麼在程式間或程式內部的子過 程(函式)之間傳遞這些資料呢?拖著這成百上千的位元組拷貝來拷貝去嗎?顯然會浪費效率。那麼怎麼辦?當然傳遞這些物件的首位址是乙個辦法,但這至少有兩個 缺點:

暴露了核心物件本身,使得程式(而不是作業系統核心)也可以任意地修改物件地內部狀態(首位址都知道了,還有什麼不能改的?),這顯然是作業系統核心所不允許的;

作業系統有定期整理記憶體的責任,如果一些記憶體整理過一次後,物件被搬走了怎麼辦?

所以,windows作業系統就採用進一步的間接:在程序的位址空間中設一張表,表裡頭專門儲存一些編號和由這個編號對應乙個位址,而由那個位址去引用實際的物件,這個編號跟那個位址在數值上沒有任何規律性的聯絡,純粹是個對映而已。

在windows系統中,這個編號就叫做"控制代碼"。

handle在windows中的含義很廣泛,以下關於談到的handle除非特別說明,將僅限於程序、執行緒的上下文中。

1、先來談談handle

handle本身是乙個32位的無符號整數,它用來代表乙個內 核物件。它並不指向實際的核心物件,使用者模式下的程式永遠不可能獲得乙個核心物件的實際位址(一般情況下)。那麼handle的意義何在?它實際上是作為 乙個索引在乙個表中查詢對應的核心物件的實際位址。那麼這個表在**呢?每個程序都有這樣的乙個表,叫控制代碼表。該錶的第一項就是程序自己的控制代碼,這也是為什麼你呼叫getcurrentprocess()總是返回0x7fffffff原因。

簡單地說,handle就是一種用來"間接"代表乙個核心物件的整數值。你可以在程式中使用handle來代表你想要操作的核心物件。這裡的核心物件包括:事件(event)、執行緒、程序、mutex等等。我們最常見的就是檔案控制代碼(file handle)。

另外要注意的是,handle僅在其所屬的程序中才有意義。將乙個程序擁有的handle傳給另乙個程序沒有任何意義,如果非要這麼做,則需要使用duplicatehandle(),在多個程序間傳遞handle是另外乙個話題了,與這裡要討論的無關。

MFC 控制代碼的理解

控制代碼只是從英文 handle 翻譯過來的,只問句是什麼意思難以解釋,這個是我從別人的空間收集的資訊,功能上的理解 什麼是 控制代碼 handle handle 的本意是把柄,把手的意思。是你與作業系統打交道的東東。舉個通俗的例子,比如你考上了大學,入學後,學校 作業系統 會給你乙個學生證號。注意...

控制代碼Handler的理解

總的來說,控制代碼可以簡單理解為指標,乙個指向指標的指標。控制代碼是wondows用來標識被應用程式所建立或使用的物件的唯一整數,windows使用各種各樣的控制代碼標識諸如應用程式例項,視窗,控制,位圖 gdi物件等等。windows控制代碼有點象c語言中的檔案控制代碼。由以上的引用可知,控制代碼...

對控制代碼的理解

從廣義上,能夠從乙個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是 handle 本義就是 柄 只是在電腦科學中,被特別地翻譯成 控制代碼 其實還是個 柄 從乙個小東西拎起一大堆東西,這難道不像是個 柄 嗎?然後,指標其實也是一種 控制代碼 只是由於指標同時擁有更特殊的含義 實實在在地...