這篇文章是對windows對象的總結,在winows編程中,windows對象,句柄是一個基本概念,理解這些概念有助於後面的windows編程學習。文章的形式仍是以解答問題的方式來組織。編程
注:在文中,對象對應的英語翻譯是object,句柄對應的英語翻譯是handle.windows
欲解釋內核對象,須要先解釋windows下對象(object)和句柄的概念。在windows中,對象其實指的是一個通用的結構,這個數據結構表明的一個系統資源,例如一個文件資源,線程資源等等。當咱們操做的時候,只能經過句柄來操做這個對象表明的資源,不管你是文件仍是線程。這個時候會有一個問題:
windows爲何要將對象統一塊兒來,只能經過句柄來操做對象表明的資源?
大約有如下幾點緣由:安全
*統一使用句柄,能夠理解爲封裝,這意味着用戶不須要關心對象的具體細節。這樣就能夠在系統升級的時候對用戶的程序沒有影響。數據結構
*更好地利用windows安全策略,每一個對象都有獨立的訪問控制列表(ACL),這樣就能夠限定訪問對象的行爲。例如咱們想要讀取某個文件,可是當前用戶沒有權限,那麼就會返回一個空的句柄。學習
在windows編程中,咱們每時每刻都在和windows對象打交道,例如進程,線程,文件等等。其實微軟對windows對象作了分類:用戶對象,內核對象,GDI(這是圖像驅動接口,在這裏不討論這個)。
用戶對象線程
主要用來窗口相關的管理,例如Cursor,Hook,Window,這些都是用戶對象翻譯
內核對象對象
用來進行更底層的系統資源管理,例如內存,進程通訊等等。繼承
更詳細的信息請點擊連接(msdn).接口
在這裏,須要簡單說下用戶對象和內核對象一個重要的區別:
每一個用戶對象只能有一個句柄;而每一個內核對象卻能夠有多個句柄,例如:Mutex是內核對象,用於多進程的同步,在某處建立,返回句柄,也能夠在其它的進程打開(這其實也依賴此內核對象的安全屬性設置)。
在此須要說明下,內核對象共享指的是跨進程共享內核對象。
先說第二個問題,當咱們不須要使用內核對象的時候,直接調用CloseHandle便可,在系統內部維護着此內核對象的信息,當使用此內核對象的進程爲0時,系統會銷燬此對象。
接下來就是內核對象的共享方式了,首先要了解,爲何要共享內核對象?緣由很簡單:在不少場景下都須要使用共享內核對象的方式,例如使用文件映射對象能夠在不一樣進程之間共享數據。
在windows中,有三種方法能夠用來共享內核對象:
a. 繼承
在建立內核對象時,須要使用默認的安全性來建立,同時要將SECURITY_ATTRIBUTES中的bInhertHandle置爲true。這樣在建立子進程的時候,將建立的參數--bInheritHandles設置爲true,這樣就能夠子進程就能夠訪問父進程相應的內核對象了。
b. 爲對象命名
首先a進程建立一個內核對象,並對其命名爲A,若是b進程想訪問A,那麼能夠建立一個相同的內核對象,將其命名爲A,若是b對象有足夠的權限,那麼新建立的內核對象將指向A,b進程就能夠訪問A了。
c. 使用DuplicateHandle方法
A進程調用此方法,將B進程中的內核對象共享到C進程中。
以上就是對Windows對象的總結。