一·、控制代碼定義
控制代碼就是個數字,一般和當前系統下的整數的位數一樣,比如32bit系統下就是4個位元組。
這個數字是乙個物件的唯一標示,和物件一一對應。
這個物件可以是乙個塊記憶體,乙個資源,或者乙個服務的context(如 socket,thread)等等。
這個數字的**可以有很多中,只要能保證和它代表的物件保持唯一對應就可以,比如可以用記憶體位址,也可以用控制代碼表的序號,或者乾脆用乙個自增id,再或者用以上的值去異或乙個常數。
傳統上作業系統核心和系統服務api都是 c 語言介面的,但是其內部設計理念上又是oo的,所以有物件概念卻沒有對應的語言語法支援。
控制代碼的作用就是在 c 語言環境下代替 c++ 的物件指標來用的。
建立控制代碼就是構造,銷毀控制代碼就是析構,用控制代碼呼叫函式相當於傳入this指標。
如果有系統api是 c++ 介面的,那麼就沒有控制代碼了,而是某個介面指標,i***ptr之類的,比如windows的com ptr。
二·、控制代碼與指標的區別
控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以windows給每個使用globalalloc等函式宣告的記憶體區域指定乙個控制代碼(本質上仍是乙個指標,但不要直接操作它),平時你只是在呼叫api函式時利用這個控制代碼來說明要操作哪段記憶體。當你需要對某個記憶體進行直接操作時,可以使用globallock鎖住這段記憶體並獲得指標來直接進行操作。
「控制代碼」(handle),handle的本意是把柄,把手的意思。是你與作業系統打交道的東西。舉個例子:比如你做了虧心事(我說的是比如,呵呵),不幸讓我抓住了把柄,那麼我讓你做什麼你就得做什麼,因為你的把柄在我這。我們程式設計的時候也是這樣,比如我們要想操縱乙個視窗,那我們就必須「抓住它的把柄」,只有這樣,我們才能改變它的屬性,改變它的式樣,甚至銷毀它(狠了點兒)。我們再引用乙個通俗一點的例子,比如你考上了大學,入學後,學校(作業系統)會給你乙個學生證號。注意,這個號碼是學校指定的,你無法自選。有了這個號碼(學生證,假設一證多用)就可以享受學校提供的服務:如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裡買啤酒,因為學校不允許這種服務。而在計算機中系統提供的服務就是api呼叫,你有了handle,就可以理直氣壯地向系統提出呼叫api的服務。而指標的權力就大多了,有了指標你可以到處去喝酒,打架,學校(作業系統)管不著,所以控制代碼和指標的區別在於控制代碼只能呼叫系統提供的服務。而控制代碼雖然是乙個能相互區別的號碼,但與我們普通的id號又有區別,普通的id號是可以由程式設計師自己定義的,而控制代碼不行,它是物件生成時系統指定的,是為了區別系統中存在的各個物件,這個控制代碼不是由程式設計師賦給的。實際應用中,最常用的就是檔案控制代碼和視窗控制代碼。例如,視窗控制代碼的值是乙個長整數,每個窗體都用乙個控制代碼來表示。所以控制代碼是不會重複的,很多的函式都會用到窗體的控制代碼。
控制代碼是什麼?
控制代碼是乙個指向指標的指標,我們知道,指標中儲存的是記憶體位址。那麼乙個指向指標的指標,它儲存的就是另乙個指標的位址,我們可以通過乙個指標來找到另乙個指標,再通過另乙個指標訪問到具體的資料,那麼為什麼要這麼麻煩呢?我們知道,當執行乙個占用大量記憶體的程式時,系統記憶體很快就會被填滿,這時 wind...
控制代碼是什麼
控制代碼 handle 是乙個是用來標識物件或者專案的識別符號,可以用來描述窗體 檔案等,值得注意的是控制代碼不能是常量 handle 控制代碼,是windows用來表示物件的 不是c 的物件 hwnd是其中一種,hwnd是handle,但handle不只是hwnd,handle是乙個通用控制代碼表...
Linux 控制代碼是什麼
1.控制代碼就是乙個識別符號,只要獲得物件的控制代碼,我們就可以對物件進行任意的操作。2.控制代碼不是指標,作業系統用控制代碼可以找到一塊記憶體,這個控制代碼可能是識別符號,map的key,也可能是指標,看作業系統怎麼處理的了。fd算是在某種程度上替代控制代碼吧 linux 有相應機制,但沒有統一的...