C++中句柄的介绍

上传人:豆浆 文档编号:33455383 上传时间:2018-02-15 格式:DOC 页数:3 大小:41KB
返回 下载 相关 举报
C++中句柄的介绍_第1页
第1页 / 共3页
C++中句柄的介绍_第2页
第2页 / 共3页
C++中句柄的介绍_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《C++中句柄的介绍》由会员分享,可在线阅读,更多相关《C++中句柄的介绍(3页珍藏版)》请在金锄头文库上搜索。

1、句 柄 概 念在 Windows 编 程 中 是 一 个 很 重 要 的 概 念 , 在 许 多 地 方 都 扮 演 着 重 要 的 角 色 。 但 由此 而 产 生 的 句 柄 概 念 也 大 同 小 异 , 比 如 : Microsoft Windows 3 Developers Workshop ( Microsoft Press,by Richard Wilton) 一 书 中 句 柄 的 概 念 是 : 在Windows 环 境 中 , 句 柄 是 用 来 标 识 项 目 的 。 在 程 序 设 计 中 , 句 柄 是 一 种 特 殊 的 智 能 指 针 。 当 一 个 应 用 程

2、序 要 引 用 其 他 系 统( 如 数 据 库 、 操 作 系 统 ) 所 管 理 的 内 存 块 或 对 象 时 , 就 要 使 用 句 柄 。 句 柄 与 普 通 指 针 的 区 别 在 于 , 指 针 包 含 的 是 引 用 对 象 的 内 存 地 址 , 而 句 柄 则 是 由 系统 所 管 理 的 引 用 标 识 , 该 标 识 可 以 被 系 统 重 新 定 位 到 一 个 内 存 地 址 上 。 这 种 间 接 访 问 对象 的 模 式 增 强 了 系 统 对 引 用 对 象 的 控 制 。 在 上 世 纪 80 年 代 的 操 作 系 统 ( 如 Mac OS 和 Windo

3、ws) 的 内 存 管 理 中 , 句 柄 被 广泛 应 用 。 Unix 系 统 的 文 件 描 述 符 基 本 上 也 属 于 句 柄 。 和 其 它 桌 面 环 境 一 样 , Windows API 大 量 使 用 句 柄 来 标 识 系 统 中 的 对 象 , 并 建 立 操 作 系 统 与 用 户 空 间 之 间 的 通 信 渠 道 。例 如 , 桌 面 上 的 一 个 窗 体 由 一 个 HWND 类 型 的 句 柄 来 标 识 。 如 今 , 内 存 容 量 的 增 大 和虚 拟 内 存 算 法 使 得 更 简 单 的 指 针 愈 加 受 到 青 睐 , 而 指 向 另 一 指

4、 针 的 那 类 句 柄 受 到 冷 淡 。尽 管 如 此 , 许 多 操 作 系 统 仍 然 把 指 向 私 有 对 象 的 指 针 以 及 进 程 传 递 给 客 户 端 的 内 部 数组 下 标 称 为 句 柄 。 1 项 目 包 括*.模 块 ( module) *.任 务 ( task) *.实 例 ( instance) *.文 件 ( file) *.内 存 块 ( block of memory) *.菜 单 ( menu) *.控 件 ( control) *.字 体 ( font) *.资 源 ( resource),包 括 图 标 ( icon) , 光 标 ( curs

5、or) , 字 符 串 ( string)等 *.GDI 对 象 ( GDI object) , 包 括 位 图 ( bitmap) , 画 刷 ( brush) , 元 文 件( metafile) , 调 色 板 ( palette) , 画 笔 ( pen) , 区 域 ( region) , 以 及 设 备 描述 表 (device context) 。 原 理WINDOWS 程 序 中 并 不 是 用 物 理 地 址 来 标 识 一 个 内 存 块 , 文 件 , 任 务 或 动 态 装 入 模块 的 。 相 反 , WINDOWS API 给 这 些 项 目 分 配 确 定 的 句

6、 柄 , 并 将 句 柄 返 回 给 应 用 程 序 ,然 后 通 过 句 柄 来 进 行 操 作 。 在 WINDOWS 编 程 短 平 快 ( 南 京 大 学 出 版 社 ) 一 书 中 是 这 么 说 的 : 句 柄 是WINDOWS 用 来 标 识 被 应 用 程 序 所 建 立 或 使 用 的 对 象 的 唯 一 整 数 , WINDOWS 使 用 各 种 各样 的 句 柄 标 识 诸 如 应 用 程 序 实 例 , 窗 口 , 控 件 , 位 图 , GDI 对 象 等 等 。 WINDOWS 句 柄有 点 象 C 语 言 中 的 文 件 句 柄 。 从 上 面 的 2 个 定 义

7、 中 我 们 可 以 看 到 , 句 柄 是 一 个 标 识 符 , 是 拿 来 标 识 对 象 或 者 项目 的 。 它 就 像 我 们 的 车 牌 号 一 样 , 每 一 辆 注 册 过 的 车 都 会 有 一 个 确 定 的 号 码 , 不 同 的 车号 码 各 不 相 同 , 但 是 也 可 能 会 在 不 同 的 时 期 出 现 两 辆 号 码 相 同 的 车 , 只 不 过 它 们 不 会 同时 处 于 使 用 之 中 罢 了 。 从 数 据 类 型 上 来 看 它 只 是 一 个 32 位 的 无 符 号 整 数 。 应 用 程 序几 乎 总 是 通 过 调 用 一 个 WIND

8、OWS 函 数 来 获 得 一 个 句 柄 , 之 后 其 他 的 WINDOWS 函 数 就可 以 使 用 该 句 柄 , 以 引 用 相 应 的 对 象 。 在 WINDOWS 编 程 中 会 用 到 大 量 的 句 柄 , 比 如 :HINSTANCE( 实 例 句 柄 ) , HBITMAP( 位 图 句 柄 ) , HDC( 设 备 描 述 表 句 柄 ) ,HICON( 图 标 句 柄 ) 等 等 。 这 当 中 还 有 一 个 通 用 的 句 柄 , 就 是 HANDLE。 语 句HINSTANCE hInstance; 可 以 改 成 : HANDLE hInstance; 上

9、 面 的 2 条 语 句 都 是 对 的 。 一 个 WINDOWS 应 用 程 序 可 以 用 不 同 的 方 法 获 得 一 个 特 定 项 的 句 柄 。 许 多 API 函数 , 诸 如 CreateWindow,GlobalAlloc,OpenFile 的 返 回 值 都 是 一 个 句 柄 值 。 另 外 ,WINDOWS 也 能 通 过 应 用 程 序 的 引 出 函 数 将 一 个 句 柄 作 为 参 数 传 送 给 应 用 程 序 , 应 用 程序 一 旦 获 得 了 一 个 确 定 项 的 句 柄 , 便 可 在 WINDOWS 环 境 下 的 任 何 地 方 对 这 个

10、句 柄 进 行操 作 。 其 实 句 柄 的 大 量 使 用 已 经 影 响 到 了 每 一 个 WINDOWS 的 程 序 设 计 。 一 个 句 柄 , 只 有 当 唯 一 地 确 定 了 一 个 项 目 的 时 候 , 它 才 开 始 有 意 义 。 句 柄 对 应 着 项目 表 中 的 一 项 , 而 只 有 WINDOWS 本 身 才 能 直 接 存 取 这 个 表 , 应 用 程 序 只 能 通 过 API函 数 来 处 理 不 同 的 句 柄 。 举 个 例 子 来 说 吧 , 比 如 : 我 们 可 以 为 我 们 的 应 用 程 序 申 请 一块 内 存 块 , 通 过 调

11、用 API 函 数 GlobalAlloc, 来 返 回 一 个 句 柄 值 : hMem=GlobalAlloc(.); 其 实 现 在 hMem 的 值 只 是 一 个 索 引 值 , 不 是 物 理 地 址 , 应 用 程 序 还 不 能 直 接 存 取这 块 内 存 。 这 儿 还 有 一 句 题 外 话 , 是 关 于 操 作 系 统 的 内 存 管 理 的 。 一 般 情 况 下 操 作 系 统给 应 用 程 序 分 配 的 内 存 块 都 是 可 以 被 移 动 的 或 者 是 可 以 丢 弃 的 , 这 样 能 使 有 限 的 内 存 资源 得 到 充 分 利 用 。 所 以

12、, 我 们 刚 开 始 分 配 到 的 那 块 内 存 的 地 址 是 不 确 定 的 , 因 为 它 是 可以 被 移 动 的 , 所 以 得 先 锁 定 那 块 内 存 块 , 这 里 应 用 程 序 需 要 调 用 API 函 数GlobalLock 函 数 来 锁 定 句 柄 。 如 下 : lpMem=GlobalLock(hMem); 这 样 应 用 程 序 才 能 存 取 这 块 内 存 。 作 用句 柄 是 一 个 标 识 符 , 是 拿 来 标 识 对 象 或 者 项 目 的 。 应 用 程 序 几 乎 总 是 通 过 调 用 一 个WINDOWS 函 数 来 获 得 一 个

13、 句 柄 , 之 后 其 他 的 WINDOWS 函 数 就 可 以 使 用 该 句 柄 , 以 引 用相 应 的 对 象 。 如 果 想 更 透 彻 一 点 地 认 识 句 柄 , 我 可 以 告 诉 大 家 , 句 柄 是 一 种 指 向 指 针 的 指 针 。我 们 知 道 , 所 谓 指 针 是 一 种 内 存 地 址 。 应 用 程 序 启 动 后 , 组 成 这 个 程 序 的 各 对 象 是 驻留 在 内 存 中 的 。 简 单 地 理 解 , 似 乎 我 们 只 要 获 知 这 个 内 存 的 首 地 址 , 就 可 以 随 时 用 这 个地 址 访 问 对 象 了 。 如 果

14、 您 真 的 这 样 认 为 , 那 您 可 就 大 错 特 错 了 。 我 们 知 道 , Windows是 一 个 以 虚 拟 内 存 为 基 础 的 操 作 系 统 。 在 这 种 系 统 环 境 下 , Windows 内 存 管 理 器 经 常在 内 存 中 来 回 移 动 对 象 , 以 此 来 满 足 各 种 应 用 程 序 的 内 存 需 要 。 对 象 被 移 动 意 味 着 它 的地 址 变 化 了 。 如 果 地 址 总 是 如 此 变 化 , 我 们 该 到 哪 里 去 找 那 一 个 对 象 呢 ? 为 了 解 决 这 个 问 题 , Windows 操 作 系 统

15、为 全 体 应 用 程 序 腾 出 一 些 内 存 单 元 , 用 来专 门 登 记 各 应 用 程 序 的 对 象 在 内 存 中 的 地 址 的 变 化 , 而 前 者 的 物 理 地 址 在 系 统 运 行 期 间是 始 终 保 持 不 变 的 。 Windows 内 存 管 理 器 移 动 了 对 象 在 内 存 中 的 位 置 后 , 会 把 该 对 象新 的 地 址 及 时 地 告 知 给 对 应 的 句 柄 进 行 更 新 。 这 样 我 们 只 要 知 道 这 个 句 柄 , 就 可 以 间 接地 知 道 对 象 具 体 在 内 存 中 的 哪 个 位 置 了 。 这 个 地

16、址 是 在 对 象 装 载 ( Load) 时 由 系 统分 配 给 的 , 当 对 象 卸 载 时 ( Unload) 又 释 放 给 系 统 。 注 意 事 项 内 核 对 象 句 柄 , 是 用 来 标 识 某 个 内 核 对 象 的 一 个 ID 同 一 个 对 象 的 该 id 对 于 每个 进 程 是 不 同 的 , 具 体 如 何 实 现 是 ms 不 公 开 的 算 法 , 以 下 是 一 个 近 似 的 , 可 能 的 算法 : 进 程 创 建 时 , windows 系 统 为 进 程 构 造 了 一 个 句 柄 表 当 该 进 程 希 望 获 得 一 个 内 核 对 象 句 柄 或 者 创 建 一 个 内 核 对 象 从 而 获 得 该 对 象 句 柄时 系 统 会 将 在 句 柄 表 中 增 加 一 个 表 项 , 表 项 的 内 容 中 存 储 了 指 向 目 标 内 核 对 象 的指 针 同 时 , 系 统 返 回 这 个 表 项 在 句 柄 表 中 的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号