在使用c++進行windows編程時,程式員除了管理使用new/malloc動態在堆上分配出來的記憶體外,還需要對windows的核心對象、GDI對象和user對象進行管理,這些對象使用控制代碼來標識,通過操作這些控制代碼就使用不同的資來源物件。和堆記憶體一樣,程式員也需要管理這些對象資源,以免造成系統資源泄漏。
控制代碼(HANDLE)是WONDOWS用來標識被應用程式所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的控制代碼標識諸如應用程式執行個體,視窗,控制,位元影像,GDI對象等等。控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著一個資料在記憶體中的地址,得到了指標就可以自由地修改該資料。Windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。
【核心對象、GDI對象和user對象之間的區別】
核心對象是不屬於進程的,是屬於windows核心的。進程只有一個核心物件控點表,用來存放所有的核心物件控點。所以,多個進程可以同時使用一個核心對象 -- 只要有handle即可。
對於GDI對象和user對象,他們是一個進程內部擁有的東西,不會被多個進程共有。GDI對象與繪圖相關,而user與互動相關。
------
核心對象的直接擁有者是作業系統核心,所有進程共用這些核心對象,因此要有一種機制保證核心對象的正確構建、銷毀,Windows採用引用計數的技術;核心對象維護著一個引用計數成員。一個進程建立了一個核心對象,對象的引用計數為1,如果該對象又被另外的進程共用,每多一個進程,引用計數會加1,當一個進程調用CloseHandle函數後,引用計數會減1,如果引用計數變為0,作業系統會銷毀該核心對象。引用計數實現上跟COM計數的引用計數類似。核心對象使用完之後,要調用CloseHandle。這個函數的作用就是將該核心對象的引用計數 - 1,當這個計數為0的時候,該核心對象會變成signal狀態,並被作業系統銷毀。
GDI對象和user對象的銷毀不需用調用CloseHandle。每一個GDI對象和user對象的銷毀都有其對應的Destroy或Delete方法。
------
## 核心對象 ##
核心對象 |
產生方法 |
事件對象 |
HANDLE CreateEvent(); |
檔案對象 |
HANDLE CreateFile(); |
檔案對應物件 |
HANDLE CreateFileMapping(); |
I/O完成對象 |
HANDLE CreateIoCompletionPort(); |
工作物件 |
HANDLE CreateJobObject(); |
信箱對象 |
HANDLE CreateMailslot(); |
互斥對象 |
HANDLE CreateMutex(); |
管道對象 |
BOOL CreatePipe(); |
進程對象 |
BOOL CreateProcess(); |
訊號量對象 |
HANDLE CreateSemaphore(); |
線程對象 |
HANDLE CreateThread(); |
等待計時器對象 |
HANDLE CreateWaitableTimer(); |
## GDI對象 ##
GDI對象 |
產生方法 |
銷毀方法 |
位元影像(HBITMAP) |
CreateBitmap,CreateBitmapIndirect, CreateCompatibleBitmap,CreateDIBitmap, CreateDIBSection,CreateDiscardableBitmap |
DeleteObject |
畫刷(HBRUSH) |
CreateBrushIndirect,CreateDIBPatternBrush, CreateDIBPatternBrushPt,CreateHatchBrush, CreatePatternBrush,CreateSolidBrush |
DeleteObject |
裝置上下文(HDC) |
CreateDC |
DeleteDC,ReleaseDC |
字型(HFONT) |
CreateFont,CreateFontIndirect |
DeleteObject |
記憶體DC(HDC) |
CreateCompatibleDC |
DeleteDC |
調色盤(HPALETTE) |
CreatePalette |
DeleteObject |
畫筆(HPEN) |
CreatePen,CreatePenIndirect |
DeleteObject |
地區(HRGN) |
CombineRgn,CreateEllipticRgn, CreateEllipticRgnIndirect,CreatePolygonRgn, CreatePolyPolygonRgn,CreateRectRgn, CreateRectRgnIndirect,CreateRoundRectRgn, |
DeleteObject |
## USER對象 ##
user對象 |
產生方法 |
銷毀方法 |
快速鍵(HACCEL) |
CreateAcceleratorTable |
DestroyAcceleratorTable |
Caret |
CreateCaret |
DestoryCaret |
游標(HCURSOR) |
CreateCursor,LoadCursor,LoadImage |
DestoryCursor |
鉤子(HHOOK) |
SetWindowsHookEx |
UnhookWindowsHookEx |
表徵圖(HICON) |
CreateIconIndirect,LoadIcon,LoadImage |
DestroyIcon |
菜單(HMENU) |
CreateMenu,CreatePopupMenu LoadMenu,LoadMenuIndirect |
DeleteMenu |
表單(HWND) |
CreateWindow,CreateWindowEx, CreateDialogParam,CreateMDIWindow |
DestroyWindow |
HDWP |
BeginDeferWindowPos |
EndDeferWindowPos |
-- 關於程式對資源的使用方式,可以從工作管理員上看到。