新 一 代 对 象 模 型 ──COM+


---- 用 对 象 来 开 发 应 用 确 实 很 方 便, 但 要 说 到 究 竟 什 么 是 对 象 ? 不 同 编 程 语 言 却 有 不 同 的 内 涵。C + +、Java、Delphi 以 及VB, 都 以 某 种 方 法 支 持 对 象, 但 它 们 之 间 的 差 别 却 给 开 发 者 添“ 乱”。 另 外, 这 些 差 别 也 给 那 些 想 用 独 立 于 语 言 的 标 准 方 法 提 供 对 象 服 务 的 厂 商 带 来 了 困 难。 解 决 问 题 的 关 键 是 要 定 义 所 有 语 言 都 能 使 用 的、 统 一 的 对 象 模 型。

COM 的 成 功 与 缺 憾

---- 微 软 的COM(Component Object Model, 组 件 对 象 模 型) 就 是 完 成 这 一 使 命 的。 它 定 义 了 独 立 于 语 言 的 概 念, 包 括 对 象 实 现 方 法、 方 法 的 启 动 方 式 等。 这 样, 程 序 员 就 可 以 用 组 件 以 及 与 语 言 无 关 的 方 法 进 行 组 件 开 发。 现 在, 用Windows 执 行 的 任 务, 相 当 一 部 分 是 以COM 为 基 础 的。 虽 然 如 此, 许 多 开 发 者 在 理 解、 使 用COM 时, 仍 感 到 有 相 当 的 难 度。 原 因 很 简 单, 为 了 在 实 际 的 编 程 语 言 中, 使 用 不 依 赖 语 言 的COM 对 象, 就 必 须 要 理 解 新 的 对 象 模 型, 即 理 解COM 是 怎 样 定 义 模 型 的。 例 如,C + + 程 序 员 为 了 制 作 新 对 象, 就 必 须 使 用 该 语 言 的new 运 算 符; 要 删 除 对 象, 就 必 须 调 用delete。 但 是, 同 一 个C + + 程 序 员, 要 使 用COM 对 象, 就 不 能 采 用 这 种 习 惯 方 法, 而 必 须 调 用COM 函 数CoCreateInstance 来 制 作 对 象; 同 样, 要 消 除 这 个COM 对 象, 必 须 启 动 对 象 的Release 方 法。

COM + 的 追 求

---- 要 使 软 件 易 学 易 用, 就 意 味 着 要 改 变 软 件 技 术 中 所 使 用 的 工 具, 这 正 是COM + 所 要 做 的。 通 常, 通 过 某 种 语 言 可 以 比 较 简 单 地 利 用COM。 例 如,VB 的 程 序 员 有 时 必 须 使 用COM 固 有 的 调 用, 但VB 本 身 却 掩 盖 了 其 中 的 许 多 细 节。 由Microsoft 实 现 的Java 虚 拟 机, 使CORBA 和Java 的 集 成 变 得 更 加 简 单。Java 程 序 员 可 以 编 写 通 常 的Java 代 码, 但 对 于C + + 的 开 发 者 来 说, 要 使 用COM, 就 需 要 理 解 相 当 数 量 的COM 规 则 和API 调 用( 图1)。COM + 虽 然 也 给 使 用VB 和Java 等 高 级 语 言 的 开 发 者 带 来 了 某 些 变 革, 但 最 大 的 受 益 者 还 是C + + 程 序 员。COM + 从 与 语 言 无 关 的 对 象 模 型 变 换 到C + + 对 象 模 型 的 大 部 分 作 业, 都 依 赖 于C + + 编 译 器。

图1 传统的COM在COM的情况下,为了制作对象信息,
需要2个过程。C++编译器和另外的MIDL编译器

---- COM + 也 提 供 标 准 库, 对 象 及 其 客 户 端 使 用 这 个 库。 但 和COM 不 同 的 是,COM + 使 得 向 这 个 库 的 调 用 成 为 不 可 见 的, 它 是 用 编 程 语 言 内 对 应 的 本 地 函 数 实 现 的。 例 如,C + + 程 序 员 为 了 制 作COM + 对 象, 不 是 使 用CoCreateInstance 而 是 使 用 标 准 的new 运 算 符。 届 时, 使 用 对 应 于COM + 的C + + 编 译 器, 生 成 调 用COM + 库 的 正 确 代 码( 图2)。

图2 C++编译器使用COM+库制作嵌入调用和元数据

COM + 中 的 元 数 据

---- 现 在,COM 对 象 用 几 个 接 口 定 义 了 自 己 支 持 的 方 法。 它 们 各 自 都 可 以 用COM 的 接 口 定 义 语 言(IDL) 来 记 述。MIDL 编 译 器 编 译 对 象 的IDL, 形 成 类 库。 通 常, 将 它 存 储 在 独 立 的 文 件 中。 对 象 的 客 户 端 读 取 该 库, 这 样 用 该 对 象 的 方 法 就 可 以 知 道 调 用 的 方 法。 在COM + 中, 开 发 者 没 有 必 要 用IDL 定 义 接 口, 只 需 要 用 编 程 语 言 的 语 法 来 定 义 对 象 的 接 口。 而 后, 该 语 言 的 编 译 器 和COM + 进 行 编 译, 生 成 用 于 该 对 象 的 元 数 据(Meta -Data)。 所 谓 元 数 据 基 本 上 是 现 在 类 库 的 超 集。 它 存 储 在 与 对 象 二 进 制 文 件 相 同 的 文 件 中。 于 是, 类 库 是 可 选 的, 所 以COM + 对 象 都 必 须 具 有 元 数 据。

---- 更 有 趣 的 是,COM + 对 象 的 元 数 据, 可 以 用 由OLE Database( 一 般, 叫 做OLE DB) 定 义 的 通 用 数 据 存 取 接 口 进 行 存 取。 这 样 一 来, 对 象 的 客 户 端, 就 可 以 使 用SQL 查 询 语 句 检 索 方 法 和 参 数 类 型。 显 然, 不 依 靠 现 在 的IDL, 就 意 味 着 为 了 实 现 同 样 的 功 能 要 在 编 程 语 言 中 追 加 语 法。Microsoft 有VB, 所 以 在VB 中 可 以 追 加 任 何 定 义 接 口 的 语 法。Java 已 经 具 有 定 义 接 口 的 标 准 语 言 结 构。 而 现 在, 在 受 惠 于COM + 的C + + 中, 却 没 有 定 义 接 口 的 标 准 方 法。

---- 所 有COM + 对 象 都 具 有 元 数 据。 因 此, 也 可 以 用 信 号 编 集(marshalling) 中 一 贯 的 方 法, 来 研 究 问 题。 所 谓 信 号 编 集 就 是 以 某 些 标 准 方 法、 打 包 方 法 调 用 的 参 数, 以 便 在 用 完 全 不 同 的 语 言 所 编 写 的 对 象 之 间 和 在 完 全 不 同 的 机 器 上 运 行 的 对 象 之 间, 能 够 高 效 地 移 动 它 们 的 参 数。 现 在 的COM 为 信 号 的 编 集 提 供 完 全 不 同 的 两 种 方 法。

---- 一 种 方 法 是, 当 某 个 对 象 利 用vtable 接 口( 也 叫 用 户 接 口) 公 开 其 方 法 时, 客 户 端 为 了 打 包 和 解 包 方 法 调 用 的 参 数, 一 般 要 依 赖 代 理(proxy) 和 柱 桩(stab)。 代 理 和 柱 桩, 使 用 与 生 成 类 库 时 同 样 的MIDL 编 译 程 序, 由 接 口 的IDL 定 义 可 以 自 动 生 成。

---- 另 一 种 方 法 是,COM 对 象 用 调 度 接 口 来 公 开 其 方 法。 在 这 种 情 况 下, 客 户 端 在 打 包 和 解 包 方 法 调 用 参 数 时, 无 须 依 赖 代 理 和 柱 桩。 客 户 端 读 取 对 象 的 类 库, 必 要 时 可 以 动 态 执 行 打 包。 但 是, 不 是 所 有 的COM 对 象 都 具 有 类 库, 所 以, 不 一 定 在 任 何 时 候 都 是 可 行 的。

---- 但 是, 所 有 的COM + 对 象 都 具 有 相 当 于 现 在COM 类 库 的 元 数 据。 就 是 说, 在COM + 中, 完 全 不 用 代 理 和 柱 桩, 就 可 以 执 行 打 包。 另 外,COM + 也 缩 小 了COM 遗 留 的vtable 接 口 与 对 象 调 度 接 口 之 间 的 差 别。Microsoft 在COM + 的 最 初 版 本 中, 虽 然 声 称 有 可 能 还 需 要 代 理 和 柱 桩, 但 作 为 方 向, 显 然 要 将 动 态 打 包 作 为 标 准 手 法。

---- 就 其 制 作 不 依 赖 语 言 的 对 象 模 型 来 说,COM + 的 数 据 类 型 的 确 重 要, 而 且 它 还 能 处 理 困 难 问 题。 不 同 的 语 言 支 持 不 同 的 数 据 类 型, 这 在 用 不 同 语 言 编 写 的 对 象 之 间 进 行 参 数 交 换 时, 会 产 生 问 题。 例 如,C + + 支 持 结 构 体, 而VB 则 不 支 持。COM 现 在 支 持vtable 接 口 用 的 数 据 类 型 集( 主 要 是 考 虑C + + 定 义 的) 和 限 制 更 多 的 对 象 调 度 接 口 用 的 数 据 类 型 集( 主 要 是 考 虑VB 定 义 的)。 在COM + 中, 定 义 了 一 个 所 有 接 口 都 能 使 用 的 共 同 数 据 类 型 集, 所 需 要 的 变 换, 靠COM 库 来 进 行。

COM + 的 其 他 特 点

---- COM + 还 带 来 了 一 些 其 它 变 革。 最 重 要 的 变 革 之 一 是, 客 户 端 在 用 完 对 象 时, 不 再 需 要 调 用Release, 而 是COM + 库 自 动 地 处 理 参 照 计 数。 这 点 恰 恰 是COM 中 最 容 易 招 致 错 误 的 地 方 之 一。 另 外,COM 支 持 接 口 继 承, 而 在COM + 中, 却 能 使 在 同 一 个 进 程 内 运 行 的COM + 对 象 间 实 现 继 承。 对 于 组 件 模 型 来 说, 这 是 个 多 年 议 论 而 未 如 愿 的 问 题。Microsoft 至 少 是 应 部 分 用 户 要 求 增 加 了 这 个 特 点。

---- 在COM + 中, 也 改 变 了COM 所 具 有 的 持 续 性(persistence) 模 型。 通 常,COM 对 象 的 制 作 者 必 须 实 现 一 个 以 上 的、 与 持 续 性 相 关 的 接 口 集 合。 而 后, 这 个 对 象 的 客 户 端 调 出 那 些 接 口 内 的 各 种 方 法, 并 让 对 象 装 载 或 保 存 其 持 续 性 的 状 态。

---- COM + 库 提 供 持 续 性 的 标 准 支 持, 这 样 就 大 大 减 轻 了 实 现COM + 对 象 的 技 术 人 员 的 工 作 量。 从 而 能 用 标 准 方 法 来 表 示 对 象 的 特 性, 这 样, 在COM + 中, 就 能 以“ 值” 来 传 递 对 象。 只 要 将 一 系 列 的 对 象 数 据 的 表 示 送 给 同 类 的 其 他 对 象 即 可。

---- 另 一 个 有 趣 的 变 革 是, 由 于 支 持 构 造 函 数(Constructor), 所 以COM + 对 象 非 常 近 似 于 典 型 的 面 向 对 象 编 程 语 言 的 对 象。 在C + + 和Java 等 语 言 中, 在 最 初 制 作 对 象 时, 可 以 定 义Constructor 方 法。 对 象 的 制 作 者 根 据 需 要 将 参 数 交 给 这 个 构 造 函 数, 所 以 使 初 始 化 变 得 很 简 单。

---- COM 对 象 不 支 持 构 造 函 数, 而COM + 对 象 支 持 构 造 函 数。 由 于 用COM + 的 构 造 函 数 中 也 能 传 递 参 数, 所 以 能 将COM + 对 象 与 现 在 最 一 般 的 面 向 对 象 语 言 更 好 地 集 成 在 一 起。

---- 若 多 达 数 百 万 行 基 于COM 的 现 有 代 码 变 得 不 能 使 用, 那 么 就 不 能 成 功 地 变 更 世 界 上 使 用 最 广 泛 的 系 统 对 象 模 型。 因 此, 要 让COM 客 户 端 像 使 用COM 对 象 那 样 使 用COM + 对 象, 同 时 也 要 使COM + 客 户 端 可 以 使 用COM 对 象。。

尚 待 解 决 的 问 题

---- 将COM 置 于Windows/Windows NT 编 程 的 中 心 地 位, 这 本 身 就 等 于 强 迫 开 发 者 要 使 用COM。 这 未 必 是 坏 事。 另 外, 使COM 更 易 用 也 是 件 好 事, 尤 其 是 对 于 使 用C + + 的 开 发 者 来 说 更 是 如 此。 但 是, 在COM + 中 也 有 不 尽 人 意 的 地 方。

---- 首 先, 和MTS(Microsoft Transaction Server) 一 样,COM + 只 能 在Microsoft 平 台 上 使 用。 这 就 影 响 了Microsoft 关 于 多 种 平 台COM /DCOS 构 想 的 实 现。 虽 然 传 统 的COM 对 象 与COM + 对 象 可 一 起 相 互 作 用, 但 多 种 平 台 的 程 序 员 必 须 要 掌 握 新 旧 两 种 开 发 技 术。

---- 另 一 个 问 题 是, 这 一 变 更 带 来 了 混 乱。 这 并 不 能 说 是 软 件 业 界 的 变 化 迟 缓 所 致。 实 际 上, 几 乎 所 有 的Windows 开 发 者, 大 都 是 最 近 才 获 得COM 的 知 识。 毋 庸 置 疑,COM + 使COM 更 加 易 用, 但 对 象 的 工 作 方 法 也 将 发 生 变 化。 此 外, 用 户 可 能 会 担 心 这 种 变 化 对 老 应 用 的 支 持, 特 别 是 对 于 那 些 构 筑 历 史 遗 留 下 来 的 主 干 应 用 的 工 作 组 来 说, 尤 其 如 此。 它 们 的 客 户 不 一 定 对 最 新 技 术 那 么 感 兴 趣, 它 们 所 追 求 的 是 能 高 效 运 营 业 务 的 技 术。

---- COM + 将 影 响 到Microsoft 一 年 前 刚 刚 推 出 的MTS 等 企 业 的 主 干 软 件。 要 这 么 快 的 变 更MTS, 维 持 现 在 构 筑 的MTS 应 用 所 需 的 技 术,10 年 之 后 将 会 消 失 贻 尽。 但 是, 极 有 可 能 还 仍 然 要 使 用 那 些 基 于MTS 的 作 用。 这 对 于 担 负 维 护 这 些 应 用 的 程 序 员 来 说, 是 个 很 大 的 课 题。Microsoft 必 须 牢 牢 抓 住 企 业 的 心 理, 要 充 分 理 解: 对 于 计 算 机 技 术 的 大 多 数 用 户 来 说, 技 术 的 稳 定 性 比 先 进 性 更 为 重 要。

实 用 化 前 景

---- Microsoft 在1997 年9 月 发 布 了COM +。 据 说, 预 计 要 在1998 年 下 半 年 发 布COM + 库。 但 是, 这 不 过 是 第 一 步 而 已。 为 了 高 效 地 使 用COM +,C + + 编 译 程 序 等 开 发 工 具 必 需 要 进 行 变 更, 以 便 能 使 用COM + 库。 这 就 需 要 一 些 时 日。 对 于 大 多 数 人 来 说,COM + 要 成 为 工 具 的 标 准 部 分, 大 概 要 等 到1999 年 以 后。


中国计算机世界出版服务公司版权所有