C3、內核對象

一、引用計數

二、安全性:客戶端一般傳遞NULL,爲默認的安全屬性。

n         如果在WIN98上開發、運行良好,而在WIN2000出錯,可以把安全屬性改爲:KEY_QUERY_VALUE

n         如何區分內核對象還是GDI或用戶對象?區別在於創建函數是否有安全屬性。

三、跨進程邊界共享內核對象(方法)

a)         (對象句柄的)繼承性:

n         創建子進程時,bInheritHnadles=1,將繼承父進程中可繼承的內核對象(創建時使用了可繼承標誌)。

n         只有在子進程創建之前的可繼承對象才能被繼承。

n         傳遞方法:

1.命令行參數,用sscanf分析

2.進程間通信,WaitForInputIdle

3.環境變量,GetEnvironmentVariable

n         改變句柄標誌:SetHandleInformation, GetHandleInformation

b)        命名對象(部分),eg

n         CreateMutex, CreateEvent, CreateSemaphore, CreateWaitableTimer, CreateFileMapping, CreateJobObject。所有這些函數有一個共同的最後參數pszName,如果=NULL,則爲匿名內核對象(可通過可繼承性或DuplicateHandle共享);如果=0結尾的字符串(長<MAX_PATH)則爲命名對象(但是,可以因爲名稱衝突而創建失敗,GetLastError返回ERROR_INVALID_HANDLE)。

n         不必爲可繼承句柄。

n         第二個進程可以用相同的名稱創建對象(實際上是對原對象的引用,可以用GetLastError()== ERROR_ALREADY_EXISTS判別)

n         顯式共享的方法(使用Open*函數):OpenMutexOpenEvent, OpenSemaphore, OpenWaitableTimer, OpenFileMapping, OpenJobObject。其最後的參數pszName必須指明內核對象的名稱。如果不存在,GetLastError返回ERROR_FILE_NOT_FOUND。如果有訪問權,則句柄表跟新。如果bInheritHandle=TRUE,則可繼承。

c)        終端服務器的名字空間

n         顯式進入全局名稱空間方法,用“Global/”,eg

HANDLE h = CreateEvent(NULL, FALSE, FALSE, “Global//MyName”);

n         顯式進入會話的名字空間方法,用“Local/”,eg

HANDLE h = CreateEvent(NULL, FALSE, FALSE, “Local//MyName”);

n         Global, Local, SessionWindows保留關鍵字,區分大小寫。

d)        複製對象句柄(DuplicateHandle

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章