核心物件的建立和使用

2021-09-19 12:36:07 字數 2428 閱讀 6366

1

、程序核心物件控制代碼表

2、建立與關閉核心物件

3、程序間核心物件控制代碼的共享

1、程序核心物件控制代碼表

當乙個程序初始化時,系統會為它分配一張核心物件控制代碼表。這個表只用於管理核心物件控制代碼。

gdi和使用者物件不會影響到這張表。表中的每一項有

4個域。

即控制代碼id

,物件記憶體位址,訪問遮蔽位,標誌位。

當乙個程序初始化時,控制代碼表為空。

現在假設你呼叫

createfile

函式建立乙個檔案物件,核心首先會查詢當前程序中的控制代碼表,將乙個空的表項取出來,並分配乙個核心物件,將該物件的位址寫入第二個域(即,物件記憶體位址),然後訪問遮蔽設定為完全訪問,相應的標誌位也會被設定。用於核心物件建立時返回與程序相關的控制代碼,而這些控制代碼可以在同乙個程序中被其所有執行緒使用。該控制代碼是乙個非透明值,有可能返回的是控制代碼表中的索引,也有可能是乙個其它的值。但這個控制代碼的確是可以與這個核心物件相關聯。

2、建立與關閉核心物件

如果建立核心物件失敗,那返回的控制代碼通常為

null

,但也有可能是

invalid_handle_value

,例如createfile

函式。當檢視乙個函式的返回值時,應該特別小心。

無論你是怎麼建立核心物件,都應該呼叫

closehandle

將其釋放。核心會檢測這個物件的引用計數,當發現他的引用計數為

0的時候,便會將其釋放。

並且,如果乙個程序中,如果呼叫了

closehandle

,則這個

handle

對此程序則會變成無效,而對於其它使用這個核心的程序來說,並沒有影響。

3、程序間核心物件控制代碼的共享

當乙個程序建立出乙個核心物件時,這個物件就與此程序相關聯。但是,並不是所有情況都是如此,許多時候,我們需要多個程序之間共享核心物件。共享乙個核心物件控制代碼的方法大概有三種。

1、通過繼承共享,

2、通過有名核心物件共享。

3、通過控制代碼拷貝共享。

注:共享的是核心物件的控制代碼,核心物件屬於核心,無法共享。

通過繼承共享則要求共享的程序間是父子關係。

如乙個程序中呼叫

createfile

建立了乙個檔案物件。如果我們想要這個物件的控制代碼在這個程序的子程序中被使用。則我們在建立這個物件時,對

securyty_attributes

結構中的

binherithande

設定為true

。這樣這個控制代碼就能夠被子程序共享。

而我們在建立子程序時,需在呼叫

createprocess

時將其引數

binherithandles

傳遞為true

,標誌著他需要繼承父程序的控制代碼。

值得注意的是,繼承控制代碼相當於是對父程序中控制代碼的拷貝,當乙個程序被建立時,如果指定為需要對父程序中的控制代碼進行繼承,則系統會查詢其父程序中的控制代碼表,找到可以繼承的控制代碼,並將其整個表項複製到子程序的控制代碼表中。核心物件的引用計數相應增加1。

因此,如果乙個子程序被建立後。父程序又建立了乙個可以繼承的物件控制代碼。但這個控制代碼不會被子程序繼承。

另外乙個問題就是,子程序無法知道自己擁有了該控制代碼的使用權,此時就需要通過一些手法來讓子程序知道。最常用的便是通過引數傳遞。將控制代碼值通過

pcommandline

傳遞給子程序,子程序解析後使用。也可以通過訊息或是環境變數的方式通知。。

通過有名物件進行物件控制代碼共享是最簡單的方式,像事件,訊號量,互斥變數等都支援有名建立。如建立

createmutex

的時候,只需為其最後乙個引數傳遞乙個

0結尾的字串,便可以標誌這個變數。需要注意的是,這個名字很有可能衝突,不同種內的核心物件共同使用乙個名字池,如果已經有這個名字,並且先前使用此名字的核心物件也是乙個

mutex

,則當呼叫

getlasterror()

時,會返回

error_already_exists

。系統將直接返回其控制代碼,並將其引用計數加

1。否則返回

null

,表示建立失敗。

由於這個特性,我們可以使用它來強制你的程式只能開乙個例項。**如下

最後乙個共享變數的方式就是採用

duplicatehandle

進行拷貝,具體用法參照

msdn

即可。

物件的控制代碼是乙個非透明的值,在不同的場合,會有不同的控制代碼與同乙個核心物件對應。標誌著不同的許可權,不同的環境。

因此用到的時候要十分小心。並且應該注意控制代碼的關閉,以防止執行過程中內在洩漏。同時應該注意控制代碼值的有效性,不要使用乙個已經釋放了的控制代碼值。

posted @

2010-06-26 11:08

麒麟子(alex) 閱讀(

...)

編輯收藏

JS中物件的建立和使用

直接建立 先建立object類物件,再向物件新增成員。var person new object person.name jt person.print function 函式表示式 呼叫 person.print 以上過程可封裝,減少 冗餘 function getperson name 張三 p...

物件的建立和釋放

1 new和delete基本語法 1 new和delete基本語法 1 在軟體開發過程中,常常需要動態地分配和撤銷記憶體空間,例如對動態鍊錶中結點的插入與刪除。在c語言中是利用庫函式malloc和free來分配和撤銷記憶體空間的。c 提供了較簡便而功能較強的運算子new和delete來取代mallo...

物件的建立和銷毀

考慮用靜態工廠方法代替構造器 示例 public static boolean valueof boolean b 當構造引數很多的時候考慮使用建造者 模式 示例 原始 public class nutritionfacts builder pattern public class nutritio...