在使用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方法。
------
## 内核对象 ##
| 核心对象 | 产生方法 |
| 事件对象 | 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 |
本文深入探讨了Windows编程中资源管理的重要性,特别强调了内核对象、GDI对象和user对象的区别及管理方式。内核对象由操作系统直接拥有,多个进程共享;GDI对象与绘图相关,user对象与交互有关,两者均为进程独有。文章详细列举了各类对象的创建与销毁方法。
&spm=1001.2101.3001.5002&articleId=88428586&d=1&t=3&u=76c5f395d16d4fbcbf539363e21d0455)
1460

被折叠的 条评论
为什么被折叠?



