windows資源管理(核心對象/GDI對象/user對象)

來源:互聯網
上載者:User

  在使用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

-- 關於程式對資源的使用方式,可以從工作管理員上看到。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.