每個核心對象只是核心分配的一個記憶體塊,並且只能由該核心訪問。該記憶體塊是一種資料結構。
對核心對象的操作,Wi n d o w s提供了一組函數來對這些結構進行操作。這些核心對象始終都可以通過這些函數進行訪問。
當調用一個用於建立核心對象的函數時,該函數就返回一個用於標識該對象的控制代碼。該控制代碼可以被視為一個不透明值,你的進程中的任何線程都可以使用這個值。將這個控制代碼傳遞給Wi n d o w s的各個函數,這樣,系統就能知道你想操作哪個核心對象。
核心對象由核心所擁有,而不是由進程所擁有。必須記住的是,核心對象的存在時間可以比建立該對象的進程長。
當一個進程被初始化時,系統要為它分配一個控制代碼表。該控制代碼表只用於核心對象,不用於使用者物件或G D I對象。控制代碼表只是個資料結構的數組。每個結構都包含一個指向核心對象的指標、一個訪問屏蔽和一些標誌。當進程初次被初始化時,它的控制代碼表是空的。然後,當進程中的線程調用建立核心對象的函數時,比如C r e a t e F i l e M a p p i n g,核心就為該對象分配一個記憶體塊,並對它初始化。這時,核心對進程的控制代碼表進行掃描,找出一個空項。由於控制代碼表是空的,核心便找到索引1位置上的結構並對它進行初始化。該指標成員將被設定為核心對象的資料結構的記憶體位址,訪問屏蔽設定為全部訪問權,同時,各個標誌也作了設定. 最後,無論怎樣建立核心對象,都要向系統指明將通過調用C l o s e H a n d l e來結束對該對象的操作。
跨越進程邊界共用核心對象
第一個方法:物件控點的繼承性
只有當進程具有父子關係時,才能使用物件控點的繼承性。
請記住,雖然核心物件控點具有繼承性,但是核心對象本身不具備繼承性。
第二個方法:對象命名
共用跨越進程邊界的核心對象的第二種方法是給對象命名。許多(雖然不是全部)核心對象都是可以命名的。
第三個方法:複製控制代碼
共用跨越進程邊界的核心對象的最後一個方法是使用D u p l i c a t e H a n d l e函數: