對象的分類:
對象分為三種:使用者對象、圖形裝置接口(GDI)對象、核心對象
三種對象的職責:
使用者對象:為視窗管理提供支援
GDI圖像裝置接口對象:為圖形展示提供支援
(!)核心對象:記憶體管理,程序執行,程序間通訊 三個主要用途
如果不做MFC相關程式設計,我們隻需要關心核心對象。
所有細分的對象清單:
https://docs.microsoft.com/en-us/windows/win32/sysinfo/object-categories
對象管理:
windows 對象(核心對象、使用者對象、GDI對象) 有标準的頭部結構和與之類型對應的屬性構成。正是因為有着較為統一的結構,故而windows系統可以很友善地統一管理這些對象。
頭部中包含了目前對象的名稱,正是有這個名稱的存在,才讓windows對象可以任意地在遊離于各個程序間。
windows對象管理器有如下職責:
1)建立對象
2)驗證某個程序是否可以通路某個對象
3)建立對象句柄,并回報給調用者
4)維護引用計數器
5)提供複制句柄的能力
6)關閉句柄
windows提供如下操作對象的接口:
1)建立對象
2)擷取一個指向對象的handle
3)擷取對象的資訊
4)設定對象的資訊
5)關閉句柄
6)摧毀對象 (确定有直接摧毀對象的接口?不是通過指向對象的句柄引用計數管理的麼?)
注:有些時候,當指向對象的所有handle都被關閉後(對象的引用計數為0),對象依舊可以存在于記憶體中。知道下一次被捕獲時,系統告知使用者目前對象已經被銷毀,這個時候核心才會釋放相應的記憶體。
- 句柄 和 核心對象都會消耗記憶體。是以句柄洩露就是記憶體洩露。句柄洩露的最常見現象就是系統占用記憶體居高不下。
- 程序退出時會釋放所有的句柄和核心對象。但是線程退出時不會。
- 核心對象銷毀時,所有綁定在其上的handle也會一并銷毀。但是我們往往是通過closehandle讓引用計數為0而銷毀對象。而不是通過銷毀對象來反過來關閉句柄。
- 有些對象隻能存在一個句柄指向它,有些對象可能有多個句柄指向它。
對象操作:
CloseHandle | Closes an open object handle. |
CompareObjectHandles | Compares two object handles to determine if they refer to the same underlying kernel object. |
DuplicateHandle | Duplicates an object handle. |
GetHandleInformation | Retrieves certain properties of an object handle. |
SetHandleInformation | Sets certain properties of an object handle. |
區分核心對象的小竅門:
但凡需要指定 安全權限