句柄(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 |