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...