第 12 章 使 用 U R L 和 M on ike r
美 国 东 北 部 的 人 们 因 为 这 样 一 句 话 而 著 称 你 不 能 从 这 儿 直 接 到 那 儿你 必 须 首 先 途 经 另 外 一 个 地 方 有 些 人 对 In te rn e t 的 看 法 也 是 如 此 看 起 来 总是 要 至 少 跨 越 四 五 个 W e b 页 面 才 能 找 到 自 己 所 需 的 起 始 站 点
正 是 这 个 原 则 导 致 有 些 W e b 拥 有 者 在 他 们 的 W e b 站 点 上 放 置 了 许 多 链接 每 个 链 接 都 指 向 与 当 前 主 题 相 关 的 信 息 ─ ─ 即 从 某 个 方 面 扩 展 该 站 点 的 信息 没 有 一 个 用 户 抱 怨 已 有 的 这 些 链 接 事 实 上 如 果 去 掉 这 些 链 接 他 们 反 而会 不 满 意
不 过 当 前 这 种 链 接 系 统 确 实 存 在 一 些 问 题 就 像 In te rn e t 上 其 它 东 西 一 样它 们 都 是 静 态 的 不 管 如 何 进 入 站 点 也 不 管 是 在 什 么 样 的 条 件 设 置 下 进 行 操作 对 于 一 个 特 定 的 站 点 得 到 的 链 接 集 合 总 是 相 同 如 果 W e b 站 点 能 有 一 点 智能 从 而 可 以 帮 助 用 户 找 到 他 们 所 需 的 东 西 那 时 又 会 怎 么 样 呢 ? 另 外 如 果用 户 能 输 入 一 些 条 件 使 得 从 一 个 站 点 到 另 一 站 点 更 加 容 易 不 是 挺 好 吗 ? 例如 可 以 按 照 目 前 需 求 输 入 某 种 判 断 条 件 来 定 位 某 种 特 殊 的 站 点 通 过 使 用 UR L
它 定 义 出 查 找 的 目 的 地 字 符 串 和 M on ike r 它 是 由 系 统 提 供 的 实 际 的 资 源对 象 A c tiv e X 提 供 了 一 种 处 理 这 种 动 态 需 求 的 方 法
注 统 一 资 源 定 位 器 (URL) 指 出 了 在 Internet 上 的 什 么 地 方 进 行 检 索
注 在 Internet 上 下 文 中 Moniker 是 指 用 于 保 存 位 置 对 象 的 资 源
1 2. 1 UR L Mo ni ker 概 述
这 一 节 中 我 们 先 介 绍 一 下 UR L 和 M on ike r 这 两 个 术 语 UR L 统 一 资 源定 位 器 是 一 种 方 法 我 们 对 它 已 经 比 较 熟 悉 了 我 们 用 它 从 一 个 站 点 走 到 另一 站 点 它 就 是 使 用 浏 览 器 时 打 入 的 h ttp ://w w w . m y c o m p a n y . c o m UR L 有 三 个主 要 部 分 它 们 是 协 议 上 例 中 是 h ttp 主 机 www 和 域 m y c o m p an y.co m 你 打 入 的 UR L 的 其 余 部 分 即 是 你 标 识 的 资 源 位 置 如 目 录 这 种 机 制 只 所以 非 常 有 用 是 因 为 可 以 无 限 制 地 扩 展 它 例 如 如 果 你 想 用 另 一 种 协 议 只需 在 UR L 的 开 头 指 明 即 可 In te rn e t 有 好 几 个 这 样 的 协 议 包 括 H TTP FT P
G ophe r 和 N e ws
注 URL 由 三 个 主 要 部 分 组 成 协 议 主 机 名 和 域
注 释 本 节 中 讨 论 的 U R L 包 括 了 全 部 的 U R L 而 不 仅 仅 讨 论 一 般 情 形 例如 一 些 URL 把 host 主 机 称 为 home 或 别 的 什 么 名 称 如http:/home .netscape.com 另 外 一 些 域 正 变 得 越 来 越 复 杂 了 从而 可 以 提 供 更 精 确 的 信 息 如 http:/www. wisconsin.edu.k6.us 是美 国 威 斯 康 星 州 小 学 校 的 U R L 一 些 浏 览 器 不 要 求 用 户 打 入 协 议 名他 们 简 单 地 为 资 源 核 对 所 有 合 适 的 协 议 总 之 除 了 U R L 不 同 于 他 们提 供 的 一 般 例 子 外 在 这 一 节 中 不 对 它 作 任 何 的 假 定
M on ike r 起 源 于 O LE 2 规 范 实 际 上 一 个 M on ike r 就 是 系 统 生 成 的 一 个 对 象你 可 以 利 用 该 对 象 找 到 另 一 对 象 或 者 从 中 获 取 数 据 某 些 定 制 的 M on ike r 还 支
持 其 它 操 作 但 任 何 M on ike r 都 提 供 两 种 基 本 操 作 O LE 2 规 范 推 出 了 同 步M on ike r 也 就 是 说 应 用 程 序 必 须 等 待 一 直 到 系 统 已 经 从 指 定 对 象 获 取 了 所 查找 的 数 据 为 止
Web 链 接 如 果 你 想 在 商 业 性 的 应 用 程 序 中 使 用 URL Monike r 最 好 先 进 行一 点 专 业 训 练 Developer Solutions 开 发 者 解 决 方 案 在http://www .devsolutions.com/ 上 开 设 了 一 门 课 程 专 门 讲 述Moniker 的 问 题 三 天 的 课 程 还 讨 论 了 各 种 其 它 与 O L E 相 关 的 主 题 如DCOM 和 编 组 (marshalli ng) 如 果 你 确 实 想 了 解 Microsoft 提 交 给 ANSI 申 请 批 准 的 OLE 标 准 的 所 有 信 息 可 以 浏 览http://inf o.gte.com/ftp/doc/ac tivities/x3h7/
by_m odel/ OLE 2.html
将 UR L 和 M on ike r 的 思 想 组 合 起 来 就 得 到 了 A c tiv e X AP 从 V is u a l C + + 4 .2
版 至 6 .0 版 的 一 部 分 提 供 的 U R L M on ike r 那 么 A c tiv e X 使 用 的 U R L M on ike r 与 O LE 2 规 范 所 说 的 同 步 有 什 么 不 同 呢 ? 一 方 面 U R L M on ike r 同 时 提 供 了 同步 和 异 步 捆 绑 这 在 In te rn e t 上 很 重 要 因 为 不 知 道 要 花 多 长 时 间 才 能 找 到 所 需数 据 如 果 对 In te rn e t 检 索 使 用 同 步 捆 绑 应 用 程 序 将 被 挂 起 并 给 客 户 机 造 成 许多 问 题 更 不 用 说 用 户 必 须 坐 在 那 里 等 待 傻 看 着 没 有 变 化 的 应 用 程 序 UR L M on ike r 还 提 供 了 一 种 建 立 并 使 用 UR L 的 框 架 这 是 O LE 2 规 范 没 涉 及 的 领 域如 果 你 要 用 标 准 的 O LE 2 应 用 程 序 访 问 远 程 数 据 那 么 它 必 须 支 持 网 络 上 的UNC 统 一 命 名 约 定 设 备 定 位 这 意 味 着 可 能 有 某 种 映 射 的 设 备 但 很 显 然
In te rn e t 定 位 是 不 可 能 做 到 的
创 建 U R L M on ik e r 需 要 三 部 分 客 户 机 系 统 和 传 输 客 户 机 部 分 已 经 常驻 于 应 用 程 序 中 了 本 章 使 用 U R L M on ik e r 一 节 将 进 一 步 讨 论 客 户 机 端系 统 组 件 指 的 是 操 作 系 统 的 一 部 分 你 不 必 担 心 这 部 分 因 为 M ic ros oft 负 责 处理 它 传 输 简 单 地 指 出 你 想 怎 样 将 信 息 从 服 务 器 发 送 给 客 户 机 这 部 分 是 可变 的 它 取 决 于 你 要 实 现 什 么 传 输 方 式 在 In te rn e t 上 一 般 使 用 TC P
注 URL Monike r 的 三 部 分 是 客 户 机 系 统 和 传 输
就 像 本 书 中 到 目 前 为 止 讨 论 的 其 它 特 殊 的 OL E 功 能 一 样 实 现 U R L M on ike r 要 求 你 创 建 或 使 用 某 些 特 殊 接 口 U R L M on ike r 的 客 户 机 系 统 和 传 输 三 个 组件 中 各 有 两 个 接 口 下 面 将 对 每 个 接 口 一 一 说 明
注 和 其 它 每 种 ActiveX 编 程 技 术 一 样 使 用 URL Monike r 也 需 要 增 加 特殊 接 口
注 请 谨 记 Windows 还 提 供 了 实 现 URL Moniker 所 需 要 的 两 个 系 统 级 接 口
-
IEnumForma
tETC 客 户 机 它 是 可 选 接 口 允 许 你 提 供 影 响 捆 绑 操 作的 特 定 协 议 信 息 例 如 要 提 供 M IM E 功 能 就 需 要 提 供 该 接 口 以 便列 举 应 用 程 序 所 支 持 的 格 式
-
IBindStatu
sCallback 客 户 机 传 输 将 使 用 该 接 口 来 通 知 客 户 机 的特 定 事 件 如 下 载 过 程 进 度 更 重 要 的 是 一 旦 从 客 户 机 经 由 系 统 到传 输 的 捆 绑 完 成 传 输 即 利 用 IB indS y s te m C a l lb a c k : : O nS ta r tb ind ing 方 法传 回 一 个 IB ind ing 接 口
-
IBindCtx
系 统 你 在 开 始 查 找 In te rn e t 资 源 时 都 必 须 使 用
C reat A s yn cB in d c tx 这 个 A c tiv e X AP I 调 用 给 IB in d S ta tu s C a llb a c k 接 口
也 可 经 给 IE m u m F ro m a t E T C 接 口 传 送 一 个 指 针 它 将 返 回 一 个 指向 IB indC tx 接 口 的 指 针 负 责 完 成 客 户 机 和 传 输 之 间 的 实 际 捆 绑
-
IMoniker
系 统 该 接 口 元 素 有 许 多 用 途 它 的 主 要 功 能 包 括 使 用G e tD is p la y N a m e 方 法 按 人 们 可 读 的 格 式 获 取 m o n ik e r 名 称 以 及 使用 B indT oS to ra ge 或 B indT oO b je c t 方 法 传 输 具 体 例 子
-
IParseDisp
layName 传 输 由 A c tiv e X 支 持 的 M k P a rs e D is p la y N a m e E x () 函 数 的 当 前 版 本 允 许 你 根 据 文 件 或 者 UR L 创 建 M on ike r 不 过 你 可 能 会发 现 需 要 根 据 其 它 类 型 的 对 象 创 建 m on ike r 该 接 口 允 许 你 的 应 用 程序 与 传 输 一 起 创 建 新 的 m o n ik e r 类 型 你 还 应 该 将 这 些 新 m o n ik e r 类 注册 到 注 册 表 中
-
IBinding
传 输 系 统 创 建 一 个 由 应 用 程 序 想 要 访 问 的 协 议 类 型 所 定义 的 传 输 IB ind ing 就 是 产 生 的 专 用 协 议 传 输 接 口 它 通 过IB in d S ta tu s C a llb a c k 接 口 负 责 分 析 协 议 串 驱 动 任 何 下 载 的 数 据 以及 给 应 用 程 序 提 供 状 态 信 息 应 用 程 序 能 利 用 IB ind ing 接 口 启 动 终 止暂 停 或 恢 复 捆 绑 操 作
高 级 技 巧
端 口 号 与 URL 的 关 系
我 不 打 算 花 费 过 多 的 时 间 去 让 你 们 学 习 那 些 可 以 留 给 工 程 师 们 解 决 的问 题 但 是 如 果 能 在 碰 到 硬 件 / 软 件 连 接 问 题 时 知 道 一 点 关 于 U R L 中 的 http 是 如 何 工 作 的 信 息 那 么 会 使 你 工 作 起 来 更 方 便
Internet 上 使 用 端 口 号 的 概 念 也 就 是 说 你 在 与 I P 地 址200.100.10 0.1 连 接 时 可 以 选 择 这 个 地 址 的 某 个 特 定 端 口
实 际 上 这 个 概 念 是 从 人 们 在 Internet 上 使 用 主 机 排 斥 一 切 的 年 代遗 留 下 来 的 你 可 以 将 某 个 终 端 插 入 主 机 背 后 的 特 定 端 口 以 获 得 特 定服 务 幸 运 的 是 你 可 以 对 P C 使 用 同 样 的 概 念 如 同 机 器 上 的 串 口和 并 口 一 样 Internet 上 的 端 口 也 有 专 用 目 的
从 软 件 角 度 也 很 好 理 解 任 何 在 机 器 上 做 过 汇 编 级 编 程 的 人 都 知 道 必 须 访 问 特 定 端 口 号 才 能 获 取 键 盘 信 息 即 使 你 没 做 过 汇 编 程 序 也可 能 使 用 特 定 端 口 来 设 置 某 个 卡 如 声 卡 任 何 想 使 用 该 声 卡 的 软件 如 游 戏 都 需 要 知 道 声 卡 的 端 口 号 才 能 发 出 声 音 同 样 如 果 你想 从 Internet 上 获 取 特 定 信 息 也 需 要 端 口 号
在 U R L 中 指 定 特 定 协 议 等 同 于 申 请 特 殊 端 口 号 老 的 通 讯 程 序 要 求 你输 入 端 口 号 谢 天 谢 地 U R L 已 经 解 决 这 个 问 题 例 如 当 你 在 U R L 中 输 入 http 时 实 际 上 是 请 求 访 问 主 机 上 端 口 号 8 0 其 它 如 TelNet 使 用 端 口 2 3 某 些 交 互 游 戏 使 用 端 口 4201 总 之 每 个 协 议 都 有 一个 特 定 端 口 号 记 住 http 比 记 住 使 用 端 口 8 0 要 容 易 得 多 由于 Internet 上 的 每 个 人 都 使 用 同 样 的 端 口 号 请 求 特 定 的 公 共 服 务 所 以 在 U R L 中 可 以 使 用 http
好 了 现 在 来 看 看 你 为 什 么 要 知 道 这 些 信 息 网 络 管 理 员 并 不 总 是 使用 服 务 的 缺 省 端 口 号 你 可 以 为 Internet 上 特 定 的 公 司 服 务 加 入 一个 特 殊 端 口 号 ─ ─ 只 要 服 务 器 软 件 允 许 这 样 设 置 就 行 尽 管 使 用 特 殊端 口 号 并 不 能 代 替 防 火 墙 和 其 它 安 全 帮 助 它 仍 不 失 为 在 Internet 服 务 器 上 设 定 一 块 不 容 别 人 窥 视 的 领 地 的 一 种 好 方 法 在 做 某 些 配 置工 作 如 设 置 防 火 墙 的 过 滤 器 时 知 道 端 口 号 也 会 带 来 方 便 最 后 尤其 对 于 程 序 员 来 说 如 果 一 切 看 似 正 常 但 却 不 能 正 常 运 行 那 么 了解 Internet 连 接 是 如 何 工 作 的 将 有 助 于 解 决 应 用 程 序 的 这 种 问 题
1 2. 2 创 建 UR L Mo ni ker
和 其 它 类 型 的 OL E 通 信 一 样 创 建 U R L M on ike r 也 遵 循 着 一 个 相 当 标 准 的过 程 这 里 存 在 着 几 级 通 信 可 以 选 择 是 否 完 整 地 实 现 某 些 接 口
( IE nu m F orm a t E T C ) 下 面 的 步 骤 使 用 最 少 的 接 口 元 素 概 述 了 一 个 典 型 的 通 信 会话 换 言 之 该 过 程 讲 述 的 只 是 经 常 看 到 的 东 西 也 包 括 了 提 高 灵 活 性 或 提 供附 加 信 息 交 换 等 内 容
-
创
建 捆 绑 环 境 可 以 利 用 A c tiv e X AP I 提 供 的 C reat A s yn cB in d C tx ( ) 函 数 该调 用 要 求 为 应 用 程 序 的 IB in d S ta tu s C a llb a c k 函 数 提 供 一 个 指 针 没 有 该 接 口系 统 和 传 输 就 没 办 法 与 应 用 程 序 进 行 通 信 如 果 应 用 程 序 需 要 实 现 特 殊 功 能如 M IM E 那 么 你 还 需 要 给 可 选 的 IE num F o rm a t E T C 接 口 提 供 一 个 指 针 格 式枚 举 器 允 许 服 务 器 和 传 输 确 定 应 用 程 序 能 处 理 什 么 数 据 格 式 它 们 总 假 定 应 用程 序 能 处 理 文 本 数 据
-
系 统
将 一 个 指 针 返 还 给 它 的 IB indC tx 接 口 该 接 口 还 通 过 捆 绑 环 境 将
IB in d S ta tu s C a llb a c k 进 行 注 册
- 一
旦 应 用 程 序 有 一 个 IB indC tx 需 要 处 理 它 就 能 通 过 调 用 C re a t U R L M on ike r ( ) 或 M k P a rs e D is p la y N a m e E x ( ) 函 数 来 创 建 U R L M on ik e r 选 择 使 用 哪 个 函 数 很 简单 如 果 你 有 m o n ik e r 则 使 用 C re a te U R L M on ike r ( ) 函 数 否 则 就 使 用M k P a rs e D is p la y N a m e E x ( ) 函 数 来 分 析 文 本 字 符 串 并 根 据 它 创 建 一 个 M on ike r 然 后 将 信 息 传 给 C re a t U R L M on ike r ( ) 函 数
注 释 V isual C++ 老 版 本 的 用 户 如 果 要 实 现 MkParseDis playNameEx() 函数 需 要 MSDN 杂 志 提 供 的 Win32API 升 级 版 这 种 支 持 已 经 封 装 在Visual C++ 5.0 和 6.0 软 件 包 中 了
- 下
一 步 是 利 用 系 统 的 IM on ike r 接 口 创 建 能 处 理 U R L M on ik e r 的 传 输 有 两种 方 法 可 以 使 用 B indT oO b je c t( ) 和 B indT oS to ra ge ( ) 调 用 允 许 你 将 指 向
B indT oO b je c t( ) 调 用 允 许 你 将 指 向 m o n ik e r 的 对 象 实 例 化 该 对 象 允 许 你 与M on ike r 进 行 交 互 一 般 是 在 W e b 站 点 上 或 其 它 活 动 连 接 中 使 用 它 调 用B indT oS to ra ge ( ) 可 获 取 由 m o n ike r 指 向 的 数 据 并 保 存 它 该 过 程 通 常 称 为 捆 绑M on ike r 实 际 上 是 你 获 取 信 息 并 存 放 到 磁 盘 上 的 你 使 用 该 调 用 类 似 于 使 用 FT P 站 点 两 情 况 下 都 要 把 在 第 二 步 中 获 得 的 指 针 作 为 调 用 的 一 部 分 传 给 IB indC tx
-
系
统 的 IM on ike r 接 口 将 为 你 装 载 一 个 专 用 传 输 服 务 程 序 而 不 管 你 请 求 什 么样 的 协 议 它 会 根 据 你 传 送 的 M on ike r 来 确 定 使 用 什 么 协 议 一 旦 专 用 传 输 服务 程 序 被 激 活 它 就 使 用 IB in d S ta tu s C a llb a c k ::O n S ta r t B in d in g ( ) 方 法 将 指 向IB ind ing 接 口 的 指 针 传 送 给 应 用 程 序
-
现
在 在 所 有 三 个 元 素 应 用 程 序 系 统 和 传 输 间 建 立 了 通 信 并 且 为 应 用程 序 提 供 了 处 理 其 它 元 素 的 两 个 接 口 IB indC tx 和 IB ind ing 应 用 程 序 能 够开 始 下 载 文 件 W e b 页 面 或 其 它 资 源 了 关 于 通 信 难 题 还 有 一 点 要 说 明 无 论何 时 应 用 程 序 申 请 数 据 时 传 输 都 会 用 IB in d S ta tu s C a llb a c k : : O n D a ta A v a ila b le ( ) 方 法 告 诉 它 下 载 的 进 度 应 用 程 序 利 用 该 方 法 传 递 的 状 态 信 息 确 定 下 载 是 否 完成 也 可 以 用 这 些 状 态 信 息 为 用 户 更 新 进 度 栏 或 其 它 状 态 指 示 器
1 2. 3 超 链 接 基 础
UR L m o n ik e r 是 从 In te rn e t 上 一 个 地 方 到 达 In te rn e t 上 另 一 个 地 方 的 OL E 实现 的 底 层 部 分 还 有 另 一 个 高 层 接 口 它 就 是 用 户 可 以 看 到 的 接 口 无 论 何 时如 果 在 浏 览 器 中 看 见 带 下 划 线 的 文 本 那 么 就 可 能 是 看 到 了 另 一 站 点 的 超 链 接
本 书 好 几 章 都 已 经 讨 论 了 该 过 程 的 HT M L 部 分 参 见 第 八 章 HT M L 概 述
注 URL monike r 接 口 的 用 户 部 分 可 以 和 Web 页 上 的 超 链 接 一 样 简 单
M ic ros oft 提 供 了 一 种 A c tiv e X 超 链 接 接 口 你 可 以 利 用 它 模 拟 A c tiv e X 控件 内 专 用 的 浏 览 器 活 动 和 其 它 形 式 的 OL E 一 样 这 意 味 着 可 以 将 浏 览 器 技 术扩 展 到 应 用 程 序 中 或 者 简 单 地 用 于 HT M L 页 面 以 便 给 A c tiv e X 控 件 提 供 另 一附 加 级 别 的 功 能 无 论 在 什 么 地 方 使 用 A c tiv e X 超 链 接 都 可 以 完 成 包 括 下 述内 容 在 内 的 一 些 基 本 服 务
-
应
用 程 序 到 应 用 程 序 没 有 浏 览 器 时 你 也 能 在 两 个 应 用 程 序 间 创 建 超链 接 如 果 需 要 在 自 己 的 LA N 上 实 现 某 种 内 部 网 站 点 这 种 功 能 就 特别 方 便
-
应
用 程 序 到 A c tiv e X /H T M L 文 档 第 11 章 已 经 介 绍 了 A c t iv e D o c u m e n t 的 工 作 原 理 文 档 实 际 上 是 在 浏 览 器 窗 口 中 显 示 的 使 用 标 准 的 HT M L < A HR E F > 标 记 完 成 从 In te rn e t 到 文 档 的 连 接 如 果 能 在 应 用 程 序 中 放 一 个控 件 并 且 它 能 自 动 与 In te rn e t 上 的 文 档 相 连 接 会 是 什 么 样 的 情 况 呢 ? 也 就 是 说 该 链 接 的 作 用 等 同 于 反 向 的 HT M L < A HR E F > 标 记
A c tiv e X 超 链 接 控 件 就 能 帮 助 你 完 成 这 个 任 务 例 如 可 以 利 用 该 功 能提 供 从 公 司 政 策 文 档 到 In te rn e t 上 其 它 信 息 源 的 链 接
- A
c tiv eD o c u m en t 到 A c tiv eD o c u m en t 你 一 般 是 在 浏 览 器 中 查 看 文 档 如果 能 在 文 档 中 使 用 锚 地 简 单 的 从 一 个 地 方 转 移 到 另 一 地 方 就 像 在HT M L 页 上 移 动 一 样 事 情 会 变 得 更 好 A c tiv e X 超 链 接 允 许 你 完 成这 样 的 功 能 你 利 用 该 功 能 从 一 个 文 档 转 移 到 另 一 文 档 就 像 在 In te rn e t
上 从 一 个 HT M L 页 面 转 移 到 另 一 HT M L 页 面 一 样
- 从
浏 览 器 A c tiv eD o c u m en t 到 M ic ros oft O f f ic e B inde r A c t ive D o c u m e nt 公 司 在 本 地 内 部 网 上 对 使 用 该 功 能 有 潜 在 的 需 求 它 允 许 用 户 把 浏 览 器中 显 示 的 文 档 转 移 到 本 地 机 器 上 的 一 个 M ic ros oft O f iic e B inde r 文 档 例如 可 以 利 用 该 功 能 提 供 与 本 地 术 语 汇 编 的 链 接 无 论 何 时 如 果 用 户不 知 道 某 个 词 的 意 思 都 可 以 沿 着 位 于 In te rn e t 上 的 链 接 到 达 术 语 汇编 的 本 地 拷 贝 从 而 弄 清 那 个 词 的 含 义
注 导 航 栈 (navigation stack) 是 在 当 前 会 话 中 访 问 的 U R L 列 表 它 由 浏览 器 维 护
不 过 在 你 使 用 上 述 任 一 种 技 巧 之 前 都 必 须 首 先 创 建 U R L m on ike r 在 前两 节 已 经 讨 论 过 这 种 过 程 另 外 你 还 需 要 A c tiv e X AP I 提 供 的 超 链 接 接 口幸 运 的 是 你 不 必 求 助 于 诸 如 为 UR L m o n ik e r 等 提 供 的 那 些 低 级 接 口 如 果 你只 是 希 望 从 A 点 到 B 点 你 就 可 以 利 用 M ic ros oft 已 经 提 供 的 下 列 四 个 函 数 来完 成
函数 | 描述 |
---|---|
H l in k S im p leN av ig ateT o S tr in g () | 该 函 数 允 许 你 到 达 基 于 字 符 串 的 新 地 点 该 字 符 串的 格 式 与 你 在 浏 览 器 中 输 入 的 字 符 串 格 式 一 样 通常 可 用 该 函 数 到 达 一 个 新 的 HT M L 文 档 或 者 同 一 HT M L 文档中的 另一位置 但 它也适用于对 象 |
H l in k S im p leN av ig ateT o M o n i ke r ( ) | 该函 数 利 用 m on ike r 作为 信 息 源 允 许 你 从 一 个 地方转移到 另一地方 通 常它适用于对 象 |
H l inkG oB a c k ( ) | 该 函 数 模 拟 浏 览 器 工 具 栏 上 的 Go B a c k 退 回 按 钮 它将 你送回导航栈 所指的先前位 置 |
H l inkG oF orw a rd ( ) | 该函数模 拟浏览器工具 栏上的 Go F o rw a rd 向前 按钮 它 将你送到导航 栈中的下一位 置 |
技 巧 这 些 简 单 的 超 链 接 函 数 都 放 在 URLHLINK.H 头 文 件 中 对 Visual C++ 5.0 以 下 版 本 的 用 户 这 个 文 件 由 ActiveX SDK 提 供 你 会 在URLMON.DLL 中 看 到 实 际 的 函 数
这 些 函 数 的 使 用 是 很 简 单 的 首 先 介 绍 比 较 容 易 理 解 的 函 数 H L inkG oB a c k() 和 H L inkG oF orw a rd ( ) 这 两 个 函 数 都 只 需 要 一 个 参 数 即 指 向 当 前 文 档 的IU nknow n 接 口 的 指 针 可 以 利 用 E x te rn alQ u er yIn terfa ce( ) 函 数 来 获 取 该 指 针
其 中 第 一 个 参 数 是 I ID _IU nknow n 第 二 个 参 数 是 一 个 指 针 变 量
H L inkS im p le N a v ig a te T oS tr ing() 和 H L inkS im p le N a v ig a te T oM on ike r ( ) 函 数 稍 复
杂 一 点 下 面 的 命 令 行 说 明 了 它 们 所 需 的 参 数
H L in k S im p leN av ig ate T oS tr in g ( s z T a rg e t , s z L o catio n , s z T a rg et F ram e, p IU n k n o w n , pIB indC tx , pIB ind S ta tus C a l lb a c k ,grf H L N F , dw R e s e rv e d )
H L inkS im p le N a v ig a te T o M on ike r ( pm kT a rg e t , s z L o c a t ion, s z T a rg e t F ra m e , pIU n kn ow n, pIB indC tx , pIB ind S ta tus C a l lb a c k ,grf H L N F , dw R e s e rv e d )
除 第 一 个 参 数 外 这 两 个 函 数 使 用 了 同 样 的 参 数 表
H L inkS im p le N a v ig a te T oS tr ing() 的 第 一 个 参 数 是 一 个 包 含 着 将 要 访 问 站 点 的 UR L
或 其 它 标 识 信 息 的 串 H L in k S im p leN av ig ateT o M o n ik er() 的 第 一 个 参 数 是 指向 m o n ik e r 的 指 针
现 在 看 看 公 共 参 数 s z L o c a tio n 包 含 同 一 页 上 某 个 位 置 的 名 称 第 8 章 已经 介 绍 了 怎 样 做 到 这 一 点 s z T a rg etF ram e 参 数 包 含 文 档 内 某 个 框 架 的 名 称 它是 HT M L 专 用 的 并 且 只 适 用 于 使 用 框 架 的 页 这 两 个 参 数 都 不 是 必 须 的 仅在 需 要 修 饰 一 些 扩 展 的 导 航 信 息 时 才 需 要 提 供 它 们 不 想 包 括 它 们 时 可 以 将 它们 的 值 设 置 为 NUL L
另 外 还 有 三 个 接 口 专 用 参 数 pIU nkno w n pIB indC tx IB in d S ta tu s C a llb a c k 这 里 只 有 pIU nknow n 参 数 是 必 须 的 它 可 以 利 用 E x te rn alQ u er yIn terfa ce() 函 数得 到 如 果 你 想 提 供 另 外 的 处 理 信 息 就 要 指 定 pIB indC tx 值 例 如 如 果 你的 应 用 程 序 提 供 M IM E 功 能 就 可 能 利 用 该 参 数 传 递 IE num F o rm a t E T C 接 口 的位 置 它 是 作 为 IB indC tx 参 数 的 一 部 分 传 递 的 但 是 不 要 给 IE num F o rm a t E T C 接 口 本 身 传 递 指 针 如 果 在 传 送 中 需 要 状 态 信 息 那 么 还 要 给 应 用 程 序 的IB in d S ta tu s C a llb a c k 接 口 传 递 一 个 指 针
剩 下 的 就 是 g rfH L N F 参 数 了 它 允 许 你 指 定 浏 览 器 的 特 定 行 为 例 如 如果 将 该 参 数 设 置 为 HL NG _ OP E N _ IN N E W W INDOW 那 么 浏 览 器 会 在 新 窗 口 中显 示 指 定 站 点 在 HL INK .H 头 文 件 对 于 V is u a l C + + 5 . 0 以 下 版 本 的 用 户 该文 件 由 A c tiv e X S D K 提 供 中 有 HL NF 值 的 完 整 列 表
1 2. 4 理 解 超 链 接 接 口
在 某 些 情 况 下 前 面 讨 论 的 简 单 的 超 链 接 函 数 调 用 还 显 得 不 够 用 例 如你 可 能 想 实 现 一 个 完 整 的 浏 览 器 把 它 作 为 应 用 程 序 的 一 部 分 另 一 种 情 形 是如 果 你 想 提 供 这 些 调 用 不 支 持 的 某 些 扩 展 功 能 比 如 操 作 历 史 列 表 等 这 时 简单 调 用 就 显 得 不 够 用 了 前 面 讨 论 的 调 用 特 别 适 用 于 只 关 心 导 航 的 情 形
对 任 何 A c tiv e X 控 件 都 需 要 提 供 一 些 附 加 的 接 口 以 便 在 应 用 程 序 中 实现 超 链 接 实 际 上 有 五 个 新 接 口 如 下 所 述
-
IHLink
必 选 项 这 是 A c tiv e X 超 链 接 接 口 的 中 心 它 是 一 个 提 供 了另 一 个 需 要 进 行 超 链 接 的 应 用 程 序 所 需 的 所 有 信 息 的 接 口 包 括 目 标m o n ik e r 实 际 对 象 标 识 UR L 风 格 的 字 符 串 以 及 一 个 友 好 的 名 称它 还 能 提 供 其 它 类 型 信 息 但 创 建 简 单 的 超 链 接 一 般 不 需 要 所 有 简 单链 接 都 是 通 过 N a v iga te 方 法 完 成 的 它 正 是 前 面 讨 论 的 简 单 函 数 使 用 的方 法
-
IHLinkTarg
et 可 选 项 利 用 该 接 口 可 以 在 文 档 中 定 位 或 者 下 载 其 它信 息 例 如 该 接 口 允 许 你 在 电 子 表 格 中 指 向 特 定 单 元 格 IH L inkT a rge t
还 提 供 了 一 种 将 指 向 文 档 的 IB ro w s e C o n te x t 接 口 的 指 针 传 递 给 调 用 的 应用 程 序 的 手 段 应 用 程 序 可 以 链 接 到 一 个 不 提 供 支 持 该 接 口 的 某 一 文档 但 也 只 能 如 此
-
IHLinkFram
e 可 选 项 记 住 在 OL E 中 框 架 是 OL E 容 器 中 的 一个 应 用 程 序 容 器 它 包 含 菜 单 和 外 部 框 该 接 口 允 许 框 架 维 护 与 OL E 容 器 通 常 为 某 种 文 档 的 联 系
-
IHLinkSite
可 选 项 这 是 管 理 超 链 接 站 点 的 接 口 它 有 两 项 基 本 任务 并 能 提 供 并 发 服 务 该 接 口 的 第 一 个 主 要 任 务 是 获 得 对 文 档 的IH L in k 对 象 的 访 问 权 访 问 该 对 象 能 提 供 许 多 信 息 如 当 前 站 点 名 接口 的 第 二 个 主 要 目 的 是 提 供 对 客 户 机 应 用 程 序 的 反 馈 例 如
O n N a v iga tionC o m p le te 方 法 能 告 诉 客 户 机 下 载 或 其 它 任 务 已 经 结 束
- IBrowseCon
text 可 选 项 应 用 程 序 通 过 该 接 口 获 得 对 浏 览 器 环 境 对象 的 访 问 所 有 浏 览 环 境 对 象 的 全 部 工 作 就 是 追 踪 导 航 栈 ─ ─ 即 当 前 会话 期 间 访 问 的 站 点 前 文 所 述 的 IH L inkG oF ow a rd() 和 IH L inkG oB a c k() 函数 正 是 根 据 该 接 口 来 完 成 它 们 的 工 作 的
实 际 上 在 这 一 组 接 口 中 有 两 级 实 现 我 们 认 为 第 一 级 是 应 用 程 序 在 这里 是 指 浏 览 器 第 二 级 是 一 个 OL E 容 器 在 这 里 是 指 文 档 浏 览 器 实 现IH L in k F ra m e 和 IB ro w s e C o n te x t 接 口 这 两 个 接 口 只 会 有 一 种 情 况 发 生 即 浏览 器 要 么 实 现 它 们 要 么 不 实 现 文 档 负 责 实 现 IH L inkT a rge t IH L in k 和IH L inkS i te 接 口
用 接 口 术 语 来 定 义 文 档 有 点 困 难 文 档 的 容 器 部 分 实 现 IH L inkT a rge t 接 口
所 以 即 使 是 处 理 一 个 包 含 多 个 对 象 的 文 档 你 也 只 能 看 到 其 中 之 一 同 样无 论 文 档 包 含 多 少 对 象 每 个 文 档 也 只 有 一 个 H L inkS ite 接 口 但 你 可 以 在 一个 文 档 中 包 含 多 个 超 链 接
让 我 们 快 速 浏 览 一 下 超 链 接 每 个 超 链 接 都 需 要 单 独 的 IH L in k 接 口 可 以用 四 个 函 数 来 建 立 IH L inkC re a t F ro m M on ik e r ( ) IH L inkC re a t F ro m S tr ing( )
IH L in k C re a t F ro m D a ta () 以 及 IH L in k Q u e ry C re a t F ro m D a ta ( ) H L ink 对 象 可 以 使 用持 久 数 据 也 就 是 说 控 件 必 须 实 现 一 个 IP e rsistS tre a m 接 口 因 为 你 可 以 从 数 据中 创 建 一 个 HL in k 所 以 就 可 能 利 用 C lip b o a rd 来 剪 切 拷 贝 并 粘 贴 它 另 外因 为 IH L in k 可 以 使 用 m on ike r 所 以 你 可 以 指 向 任 意 类 型 OL E 文 档 包 括 那 些一 般 不 在 浏 览 器 中 显 示 的 文 档 如 W o rd fo r W indow s 文 件
1 2. 5 使 用 UR L Mo ni ker
今 天 许 多 公 司 特 别 关 注 In te rn e t 因 此 在 不 久 的 将 来 访 问 In te rn e t 上的 信 息 一 定 会 像 访 问 本 地 硬 盘 数 据 一 样 容 易 实 际 上 随 着 In te rn e t E xp lo re r 4 .0 中 包 含 了 部 分 V is u a l C ++ 6 .0 特 性 M ic ros oft 已 经 向 上 述 目 标 迈 进 了 一 步 你将 会 发 现 硬 盘 和 In te rn e t 上 你 最 喜 欢 的 站 点 正 共 享 着 一 个 公 用 的 Ex p lo re r 视 图
WEB 链 接 获 取 自 己 需 要 的 信 息 经 常 是 指 访 问 自 己 的 本 地 新 闻 组 以 获 得其 它 的 程 序 员 的 帮 助 不 必 多 说 你 会 发 现 有 些 新 闻 组 比 别 人 花 更 多的 时 间 在 讨 论 URL m o n i k e r 毕 竟 它 还 算 是 一 个 神 秘 的 课 题 例 如mi cr oso ft .pu bl ic. wi n32
.programme r.ole 新 闻 组 很 长 时 间 以 来 一 直 在 讨 论 将 Moniker 捆 绑到 专 用 控 件 上 的 话 题 甚 至 还 有 一 个 新 闻 组 专 门 用 于 URL monike r microsoft. public.activex.progr amming.urlmonikers 如 果 你 想 从新 闻 组 中 的 人 那 里 获 得 Visual C++ 有 关 的 帮 助 可 以 看 一 看 microsof t public.vc. mfcole
当 然 数 据 站 点 的 这 种 界 线 模 糊 倾 向 (b lu rrin g ) 对 用 户 和 程 序 员 都 会 提 供 一些 新 机 遇 例 如 作 为 用 户 你 会 发 现 将 你 需 要 的 数 据 放 入 你 需 要 的 应 用 程 序中 去 进 行 编 辑 要 省 事 一 点 作 为 程 序 员 你 会 发 现 现 在 还 有 许 多 别 的 方 法 来 处 理一个程序 并使它产生特殊的效果
注 释 如 果 你 不 是 使 用 Visual C++ 5.0 以 上 版 本 来 创 建 本 节 的 例 子 那 么就 必 须 安 装 Activex SDK S D K 提 供 了 能 使 示 例 代 码 正 常 工 作 所 需 的URLMON.H M LINK.LIB 和 URLMON. LIB 文 件
使 应 用 程 序 具 有 特 殊 效 果 的 一 种 最 普 通 方 法 就 是 给 它 添 加 超 链 接 功 能 而最 容 易 的 添 加 方 法 是 在 应 用 程 序 的 工 具 栏 上 放 置 一 个 可 以 使 用 户 进 入 公 司内 部 网 的 按 钮 同 样 你 可 以 使 用 另 一 按 钮 允 许 用 户 选 择 特 定 站 点 或 在 公 司授 权 的 In te rn e t 站 点 列 表 中 进 行 选 择 这 正 是 本 节 要 介 绍 的 内 容 样 本 程 序 将 说明 如 何 给 某 个 典 型 的 应 用 程 序 加 入 两 个 按 钮 从 而 使 用 户 可 以 快 速 简 单 地 链 接到 In te rn e t 上
第 一 步 当 然 是 创 建 一 个 新 的 应 用 程 序 就 像 第 11 章 中 的 A c tiv e D oc um e n t 例子 一 样 你 也 可 以 使 用 老 版 本 的 M ic ros oft V is u a l C + + 编 译 器 来 创 建 这 些 代 码 本 节 假 定 你 使 用 的 是 5 .0 以 上 版 本 尽 管 用 4 .2 版 本 创 建 它 相 对 容 易 些 由 于
第 2 章 已 经 介 绍 了 使 用 M F C A p p lic a tio n W iz a rd 创 建 应 用 程 序 的 过 程 所 以 这里 只 进 行 简 短 的 描 述 在 创 建 过 程 中 你 需 要 选 择 一 些 选 项 才 能 使 例 子 正 常 工作 首 先 例 子 的 名 称 为 V ie wUR L 尽 管 你 可 以 选 择 自 己 喜 欢 的 名 字 其 次在 W iz a rd 的 第 1 页 应 选 择 S in g le D o c u m e n t 第 三 在 W iz a rd 的 第 4 页 上 应 选择 W ind ow s S o c k e ts 支 持 最 后 在 M F C A p pW iz a rd 的 第 6 页 将 B a s e C la s s 域设 置 为 C E d itV ie w 这 将 允 许 你 在 示 例 应 用 程 序 的 主 窗 口 中 编 辑 文 本
技 巧 还 有 许 多 情 况 像 本 例 一 样 不 需 要 CRichEditV iew 类 的 全 部 功 能 与CEditView 相 比 CRichEditV iew 类 不 仅 相 当 大 而 且 使 用CRichEditV iew 类 还 要 求 给 应 用 程 序 添 加 O L E 容 器 支 持 功 能 这 就 进一 步 增 大 了 应 用 程 序 的 规 模 CEditView 类 既 能 让 你 显 示 无 格 式 文本 又 能 使 应 用 程 序 比 较 小 ─ ─ 这 正 是 实 用 类 应 用 程 序 一 个 很 重 要 的考 虑 因 素
添 加 库 支 持
— 旦 W iz a rd 完 成 了 应 用 程 序 创 建 工 作 后 你 就 可 以 开 始 做 进 一 步 的 修 改 了首 先 要 完 成 的 工 作 就 是 给 应 用 程 序 加 入 超 链 接 支 持 为 此 可 在 S T DAF X .H 文件 中 加 入 下 述 的 # inc lude
/ / A dde d fo r U R L s u p p o rt. # inc lude " U R L M o n .h"
该 头 文 件 包 含 了 你 在 使 用 各 种 U R L m on ike r 有 关 命 令 时 所 需 的 所 有 #de f ine
语 句 本 章 前 面 已 经 介 绍 了 其 中 一 些 命 令 这 里 将 介 绍 它 们 是 如 何 工 作 的
注 释 老 版 本 的 Visual C + + 用 户 要 做 的 下 一 件 事 就 是 添 加 一 些 静 态 的支 持 但 是 Visual C++ 5.0 以 上 的 用 户 不 必 做 这 一 步 HLINK.LIB 和 URLMON. L IB 这 两 个 库 都 在 ActiveX SD K 的 LIB 文 件 夹 中 可 以利 用 Visual C+ + 的 Insert 插 入 | Files In to Project 文 件到 项 目 命 令 给 应 用 程 序 添 加 所 需 的 库 支 持 通 过 查 看 FileView 中的 包 括 文 件 列 表 来 检 查 是 否 真 的 添 加 了 支 持 只 需 单 击 显 示 工 作 区左 边 的 FileView 标 志 即 可
技 巧 Microsoft 打 算 将 来 把 HLINK.LIB 和 URLMON.LIB 中 的 静 态 库 支 持 放入 URLMON.DLL 中 一 定 要 在 编 写 支 持 URL monike r 的 应 用 程 序 之 前检 查 该 动 态 库 的 支 持 功 能
创 建 所 需 资 源
现 在 已 经 加 入 了 所 需 的 库 支 持 让 我 们 给 工 具 栏 添 加 一 些 按 钮 单 击 R e s ourc e V ie w 资 源 视 图 打 开 T oo lb a r 文 件 夹 然 后 双 击 ID R _ M A IN F R A M E 项
就 能 看 到 如 图 12 .1 所 示 的 标 准 工 具 栏 添 加 新 按 钮 很 容 易 你 只 需 单 击 工 具 栏末 尾 的 空 白 按 钮 然 后 开 始 在 绘 画 区 域 中 显 示 的 空 白 按 钮 上 绘 制 把 这 个 按 钮稍 微 向 右 移 动 一 点 就 能 将 它 与 工 具 栏 上 已 显 示 的 其 它 按 钮 区 分 开 图 12 .1 显示 的 是 这 个 例 子 中 添 加 的 两 个 按 钮
图 12 .1 具有 Ho me P a g e 和 An y W e b P a g e 按钮 的标 准工 具栏
注 释 增 加 按 钮 可 以 给 用 户 提 供 一 种 可 视 图 化 的 显 示 另 外 还 要 给 应 用程 序 添 加 一 些 按 钮 标 识 信 息 简 单 地 双 击 将 要 设 置 的 按 钮 的 工 具 栏 不要 单 击 刚 创 建 的 按 钮 图 标 就 会 看 到 如 下 图 所 示 的 对 话 框 对 两 个按 钮 使 用 下 表 进 行 的 设 置
标识符 |
描述 |
高度 |
宽度 |
---|---|---|---|
ID _G O _ H O M E |
C l ic k he re to go to hom e W e b pa g e .\ nH o m e W e b P a ge |
15 |
16 |
ID _G O _ S IT E |
C l ic k he re to go to a n y W e b pa g e .\ nA n y W e b P a ge |
15 |
16 |
技 巧 注 意 Caption 包 含 了 一 个 较 长 的 描 述 一 个 \ n 以 及 一 个 较 短 的 描 述 较 长 的 描 述 将 出 现 在 应 用 程 序 的 状 态 栏 上 较 短 的 描 述 用 于 当 鼠 标 停留 在 该 控 件 时 的 弹 出 帮 助 一 定 要 用 \n 分 隔 这 两 项 在 Visual C++ 应 用 程 序 中 任 何 看 到 弹 出 式 帮 助 的 地 方 都 可 以 使 用 这 种 特 殊 的 输 入 方法
单 击 第 一 个 按 钮 将 把 用 户 带 入 公 司 的 主 页 按 钮 已 经 起 作 用 在 资 源 方 面不 必 再 做 什 么 了 你 需 要 添 加 的 只 是 完 成 实 际 工 作 的 一 点 代 码 但 是 第 二 个按 钮 将 允 许 用 户 输 入 他 们 自 己 的 站 点 如 果 愿 意 的 话 还 可 以 输 入 该 站 点 中 的某 个 位 置 该 按 钮 还 支 持 那 些 使 用 框 架 的 站 点 上 的 框 架 这 就 需 要 添 加 一 个 特殊 的 对 话 框 打 开 R e s ourc e V ie w 中 的 D ia lo g 文 件 夹 用 右 键 单 击 D ia log 文件 夹 就 能 看 到 一 个 关 联 菜 单 选 择 In s e rt D ia lo g 项 就 能 看 到 一 个 名 为IDD _ D IAL OG1 的 新 对 话 框 添 加 到 了 文 件 夹 的 列 表 中 应 用 程 序 当 前 提 供 的 唯一 一 个 对 话 框 是 A bout B o x 对 话 框
现 在 给 对 话 框 改 名 用 右 键 单 击 ID D _ D IAL OG1 项 然 后 从 关 联 菜 单 中 选择 P rope r tie s 在 ID 字 段 中 输 入 ID D _ S IT E _ SE L E C T 然 后 单 击 属 性 对 话 框就 能 看 到 新 名 字 出 现 在 D ia lo g 文 件 夹 的 对 话 框 中
给 对 话 框 添 加 所 需 控 件 相 当 容 易 首 先 要 做 的 是 将 对 话 框 大 小 改 为 25 120
像 素 点 即 出 现 在 状 态 栏 右 边 的 当 前 对 话 框 大 小 这 可 能 要 占 一 点 空 间 因为 用 户 可 能 想 输 入 很 长 的 UR L 改 变 对 话 框 大 小 后 可 以 添 加 三 个 标 签 和 三 个编 辑 控 件 如 图 12 .2 所 示
图 12 .2 如果 用户 选择 访问主 W e b 站点 之外 的地 方 示例 程序 将显 示 该 对 话 框
双 击 每 个 编 辑 控 件 显 示 它 们 的 属 性 对 话 框 设 置 一 个 易 于 记 忆 的 ID 第 一个 编 辑 控 件 的 ID 为 ID C _ U R L 第 二 个 编 辑 控 件 的 ID 为ID C _ ANC H O R _ NAM E 第 三 个 编 辑 控 件 的 ID 为 ID C _ F R A M E _ N A M E 稍 后将 会 介 绍 这 些 名 称 的 作 用
定 义 新 类 并 编 写 代 码
现 在 已 经 定 义 了 所 有 所 需 的 资 源 应 该 给 添 加 到 工 具 栏 中 的 两 个 按 钮 增 加代 码 了 确 保 已 经 选 择 了 ID D _ S IT E _ SE L E C T 对 话 框 然 后 用 V ie w |C la s s W iz a rd 命 令 显 示 C las s W izard 对 话 框 在 这 种 情 况 下 你 将 看 到 如 下 图 所 示 的 对 话 框它 表 明 ID D _ S IT E _ SE L E C T 是 一 个 新 对 话 框 需 要 为 它 创 建 一 个 类
单 击 OK 你 将 看 到 N e w C la ss 对 话 框 你 需 要 提 供 的 只 是 类 名 示 例 程序 使 用 的 是 C S ite S e le c t 它 使 得 类 名 及 其 相 关 资 源 很 易 于 识 别 本 例 使 用 的 是缺 省 的 CD ia lo g 基 类 单 击 OK 完 成 操 作
选 择 C las s W izard 的 M e s s a g e M a p 页 然 后 从 C la ss N a m e 字 段 中 选 择
CM a in F ra m e 类 名 滚 动 下 拉 对 话 框 左 边 的 O b ject ID s 直 至 找 到 ID _ GO _ H O M E
单 击 该 项 然 后 单 击 对 话 框 右 边 的 M e ssa g e 字 段 中 的 C O M M A N D 项 单 击 A d d func t ion 给 应 用 程 序 添 加 所 需 函 数 此 时 会 看 到 A dd M e m b e r F unc tio n 对 话 框
单 击 OK 接 受 缺 省 函 数 名 同 样 处 理 ID _ G O _ S IT E 对 象 标 识 符 完 成 之 后 M F C C las s W izard 对 话 框 如 下 图 所 示
选 择 O n G o H o me 项 并 单 击 E d it C ode M F C C la s s W iz a rd 就 会 直 接 进 入 新 函数 框 架 程 序 列 表 12 .1 显 示 了 该 按 钮 的 代 码 确 保 将H linkS im p le N a v ig a te T oS tr ing() 函 数 调 用 的 第 一 个 参 数 与 W e b 服 务 器 的 缺 省 页 面
地 址 相 匹 配 你 会 看 到 O n G o S ite ( ) 函 数 就 在 O n G o H o m e ( ) 函 数 之 后 给 它 添 加程 序 列 表 12 .2 所 示 的 代 码 确 保 在 M a in F rm . C p p 文 件 开 头 包 括 了 S ite Se le c t. H
如 果 愿 意 的 话 还 可 在 S T DAF X .H 文 件 中 包 含 它
程 序 列 表 12.1
vo id C M a inF ra m e : : O n G oH om e ( )
{
// G o r ig h t to th e c o m p a n y 's h o m e p a g e .
H L in d S im p le N a v ig a te T o S trin g ( L " h t tp ://a u x /d e fa u lt.h tm " , N U LL ,N U L L ,N U LL ,0 ,N U LL ,N U LL ,0 ) ;
}
程 序 列 表 12.2
vo id C M a infra m e : : O nG o S i te ( )
{
/ / C rea te a c o p y o f th e d ialo g . C S ite S e le c t N e w S ite S e le c t;
//D is p la y it.
N e w S i te S e lect.D o M o d al();
}
现 在 已 有 足 够 的 代 码 可 以 将 用 户 送 往 主 页 程 序 列 表 12 .1 或 显 示 对 话 框程 序 列 表 12 .2 上 了 不 过 还 需 要 给 C S ite S e le c t 对 话 框 增 加 一 些 代 码 当 用 户 单 击 OK 时 你 可 能 想 把 他 们 带 到 他 们 选 择 的 其 它 站 点 首 先 要 添 加 一 些 内
存 变 量 来 记 录 用 户 的 输 入 再 来 看 一 看 ID D _ S IT E _ SE L E C T 对 话 框 按 下 CT RL
键 并 双 击 第 一 个 编 辑 框 就 能 看 到 如 下 图 所 示 的 A dd M e m b e r V a r ia b le 对 话 框它 允 许 你 给 ID C _ U R L 编 辑 框 赋 予 一 个 变 量 本 例 中 命 名 为 UR L 该 名 字
将 会 在 对 话 框 中 以 m _ UR L 出 现 选 择 C a te gor y 域 中 的 Co n tro l 把 V a r ia b le T y p e 域 改 变 成 CE d i t CE d it 就 是 该 例 所 需 的 变 量 类 型 单 击 OK 完 成 操 作 同 样处 理 另 两 个 编 辑 框 并 将 第 二 个 变 量 命 名 为 A n c hor 第 三 个 命 名 为 F ra m e
有 了 变 量 现 在 还 要 添 加 另 一 个 函 数 用 V iew |C la s s W izard 命 令 打 开 M F C C las s W izard 对 话 框 应 该 仍 然 显 示 M e s s a ge M a p 页 否 则 的 话 就 选 中 该 页在 C la ss N a m e 域 中 选 择 C S ite S e le c t 项 就 会 看 到 对 话 框 左 边 的 O b ject ID s 列表 变 为 C S ite S e le c t 对 话 框 提 供 的 内 容 选 中 IDOK 对 象 标 识 符 和 M e ssa g e 域 中的 BN _ C L ICK E D 项 单 击 A dd F unc tio n 然 后 单 击 A dd M e m b e r F unc tio n 对 话框 中 的 OK 这 时 M F C C las s W izard 对 话 框 如 下 图 所 示
现 在 单 击 E d it C ode 显 示 函 数 的 框 架 该 函 数 接 收 用 户 在 对 话 框 中 的 输 入信 息 然 后 将 它 们 带 到 In te rn e t 上 的 特 定 位 置 程 序 列 表 12 .3 显 示 了 完 成 该 任务 的 代 码
程 序 列 表 12.3
v o id C S ite S e le c t::O n O k ()
{
L P C W S T R |
p s z U R L = N U L L ; |
//lo c a l |
c o p y |
o f |
U R L s tr in g . |
---|---|---|---|---|---|
L P C W S T R |
p s z A n c h o r = N U L L ; |
//lo c a l |
c o p y |
o f |
A n c h o r s tr in g . |
L P C W S T R |
p s z F ra m e = N U L L ; |
//lo c a l |
c o p y |
o f |
F ra m e s tr in g . |
L P T S T R ps z B u f fe r = " " ; / / C onve r s io n b u f fe r .
// G e t th e U R L s tr in g a n d c o n v e r t it . if ( m _ U R L . L in e L e n g th( 0) > 0 )
{
}
e ls e
{
}
m _ U R L .G e t L in e ( 0 ,ps z B uffe r , m _ U R L .L ine L e n g th ( 0 ) ) ; p s z U R L = L P C W S T R ( p s z B u f fe r ) ;
M e s s ag eB o x (" Y o u m u s t en te r a U R L " ," E r ro r" ,M B _ O K ) ; re tu rn ;
//G e t th e A n c h o r s tr in g a n d c o n v e r t it. if ( m _ A n c hor.L in e L e n g th( 0) > 0)
{
m _ A n c h or.G e t L in e ( 0 ,p s z B u f fe r ,m _A n c h o r .L in e L e ng th ( 0 ) ) ;
ps z A nc hor = L P C W S T R ( ps z B uffe r ) ;
}
//G e t th e F ra m e s tr in g a n d c o n v e r t it. if ( m _ F ra m e .L in e L e n g th( 0) > 0)
{
m _ F ra m e .G e t L in e ( 0 ,psz B uffe r ,m _ F ra m e .L ine L e ng th( 0)); p s z F ra m e = L P C W S T R ( p x z B u f fe r ) ;
}
//G o r ig h t to th e s e le c te d p a g e .
H L in k S im p le N a v ig a te T o S trin g ( p s z U R L ,
ps z A nc hor, p sz F ra m e , N U L L , 0, N U L L ,N U L L , 0); C D ia lo g ::O n O K ( ) ;
}
上 述 代 码 中 有 一 些 小 技 巧 但 大 部 分 C 语 言 程 序 员 使 用 过 这 些 技 巧 首 先要 将 三 个 用 于 保 存 位 置 信 息 的 变 量 置 为 NUL L 这 样 即 使 它 们 没 有 什 么 信 息可 保 存 也 能 正 常 运 行 这 时 代 码 仍 要 强 制 用 户 提 供 UR L 只 有 一 种 情 况 不必 这 么 做 即 如 果 你 允 许 用 户 跳 到 他 们 当 前 所 在 页 的 一 个 锚 地 就 可 以 让 UR L 参 数 仍 然 是 N U LL 并 简 单 地 让 它 们 指 定 锚 地 名 称 保 存 对 话 框 中 信 息 的 方 法 需要 使 用 缓 冲 变 量 但 从 LP TS TR 指 向 W ind ow s 或 U n ic ode 的 以 NUL L 结 尾 的
长 指 针 到 LP C W S T R 指 向 以 NUL L 结 尾 的 U n ic ode 串 常 量 的 长 指 针 的 转换 很 简 单 这 个 特 殊 例 程 的 核 心 是 调 用 H L in k S im p leN av ig ateT o S tr in g 个 函 数负 责 将 位 置 信 息 转 换 为 真 正 的 UR L
现 在 让 我 们 看 一 下 应 用 程 序 是 什 么 样 子 和 通 常 一 样 编 译 并 运 行 应 用 程序 如 果 单 击 H o m e W e b P a ge 按 钮 就 能 看 到 In te rn e t E xp lore r 或 其 它 缺 省 浏览 器 启 动 了 并 把 你 带 到 设 为 主 页 的 任 何 In te rn e t 站 点 图 12 .3 显 示 了 本 例按 下 该 按 钮 的 结 果 图 中 显 示 的 主 页 是 作 者 的 In te rn e t 服 务 器 设 置 你 的 屏 幕 上应 该 显 示 自 己 的 设 置 一 定 要 将 程 序 列 表 12 .1 中 H L inkS im p le N a v ig a te T oS tr ing() 调 用 的 地 址 设 置 为 自 己 的 主 W e b 站 点 否 则 就 会 出 现 意 外 结 果
图 12 .3 可以 给任 何应 用程序 添加 这样 的按钮 从 而允许 用户 很容 易地访 问 In te rn e t
单 击 A n y W e b P a ge 按 钮 会 显 示 如 下 图 所 示 的 对 话 框
它 允 许 输 入 一 个 UR L 可 选 的 锚 地 名 或 框 架 名 目 标 W e b 页 必 须 支 持 所 指定 的 锚 地 名 和 框 架 名 否 则 函 数 调 用 会 失 败 如 果 输 入 本 地 测 试 机 器 支 持 的 地址 之 外 的 UR L 值 那 么 应 用 程 序 还 需 要 一 个 活 动 的 In te rn e t 连 接