Windows使用对象和句柄来管理对系统资源的访问有两个主要原因。首先,使用对象确保开发人员不会将代码专门写入低层次的内部结构。只要原始调用约定得到维护,Microsoft就可以添加或更改操作系统的功能。当后续版本的操作系统被释放时,应用程序将获得这种新功能,很少或没有额外的开发。
第二,使用对象使开发人员能够利用Win32的安全性。每个对象都有自己的访问控制列表(ACL),用于指定进程可以对对象执行的操作的类型。每次应用程序尝试创建对象的句柄时,操作系统将检查对象的ACL。有关安全性的更多信息,请参阅安全.
对于大多数对象,Win32 API提供了创建对象的功能,创建对象句柄,关闭对象句柄并销毁对象。这些任务可能会被组合或不必要,这取决于对象的类型和情况。例如,应用程序可以创建一个事件对象。其他应用程序可以打开该事件,并且每个应用程序将具有相同事件对象的唯一句柄。在这种情况下,随着应用程序使用对象完成,每个都关闭其句柄。当事件对象没有打开的句柄时,操作系统将从内存中删除该对象。
相比之下,应用程序可以获得现有的窗口对象句柄。在这种情况下,当不再需要窗口对象时,应用程序必须从内存中删除对象,这会使窗口句柄无效。
当进程终止时,系统会自动关闭句柄并删除进程创建的对象。但是,当线程终止时,系统通常不会关闭句柄或删除对象。唯一的例外是在创建线程终止时被删除的窗口,钩子,窗口位置和动态数据交换(DDE)会话对象。
手柄和物体消耗记忆。因此,为了保持系统性能,应用程序应该在不再需要时立即关闭句柄并删除对象。不执行此操作的应用程序可能由于页面文件的过度使用而导致操作系统的运行减慢。
Windows提供三类对象:用户,图形设备接口(GDI)和内核,如下表所示。系统使用用户对象来支持窗口管理,GDI对象支持图形,内核对象支持内存管理,流程执行和进程间通信(IPC)。有关创建和使用特定对象的信息,请参阅相关概述。
Windows用户对象
用户对象 | 概观 |
加速器表 | 键盘加速器 |
插入符号en | 插入符号 |
光标 | 游标 |
动态数据交换对话 | 动态数据交换管理库 |
桌面 | 安全 |
钩 | 钩 |
图标 | 图标 |
菜单 | 菜单 |
窗口 | 视窗 |
窗口位置 | 视窗 |
窗台 | 视窗 |
Windows GDI对象
GDI对象 | 概观 |
位图 | 位图 |
刷 | 刷 |
字形 | 字体和文字 |
调色板 | 颜色 |
钢笔 | 笔 |
延长笔 | 笔 |
地区 | 地区 |
设备上下文 | 设备上下文 |
内存设备上下文 | 设备上下文 |
图元文件 | 图元文件 |
图元文件设备上下文 | 图元文件 |
增强图元文件 | 图元文件 |
增强型图元文件设备上下文 | 图元文件 |
Windows内核对象
内核对象 | 概观 |
处理 | 进程和线程 |
线 | 进程和线程 |
文件 | 档 |
文件映射 | 文件映射 |
事件 | 同步 |
信号 | 同步 |
互斥 | 同步 |
管(命名和匿名) | 管道 |
邮筒 | 邮筒 |
通讯设备 | 通讯 |
堆 | 内存管理 |
模 | 动态链接库 |
更新资源 | 资源 |
查找文件 | 档 |
事件日志 | 事件记录 |
更改通知en | 档 |
代币 | 安全 |
服务对象 | 打印和打印后台打印程序 |
LZ文件 | 数据解压缩库 |