引 言
长期使用 M icrosoft Visual C++ 的任何人都会感受到该产品的巨大变化。 Microsoft 花了很大的力气来提高 Visual C++ 这一最新版本的易用性。然而,对 Visual C++ 程序员来说, 编写程序依然是艺术成分多于科学成分 。就在 M icrosoft 创建新的向导把一个领域的隐 秘(比如这个 Visual C++ 版本中改进的 ATL 向导)暴露于世的同时,某些新技术又把新的隐秘加入到了 Visual C++ 中 (比如 OLE-DB 和 A D O 支持等)。
不断的变化也是你需要另一本 C++ 参考书的原因。 M icrosoft 不断地向 Visual C++ 中增加新特性。虽然本书不能从理论上介绍更多的 C++ 基本编程知识,但它将会告诉你如何使用 M icrosoft 新增的新特性 。例如 ,你会在本书中找到 Visual C++ 新版本中包含的大量 ActiveX 和其它与 Internet 相关的特性。在 Visual C++ 的每一次版本更新中, Internet 的主导地位都进一步得到了增强 ,6.x 版也不例外 。正是人们对速度的渴求驱使 Visual C++ 使用某些 Internet 部件。从 Internet 上 下 载 大 型 应 用 程 序 不 是 有 效 的 用 户 选 择 , 用 户 需 要 小 型 、 快 速 的 应 用程序。听起来很熟悉,是不是?我们将花费大量的篇幅讲述如何把 Visual C++ 的 优 势 最 佳地应用到当今 Internet 驱动的编程环境中。
ActiveX 是用户与分布在 Internet 上的应用程序进行交互的方法之一。它为 W eb 网主带 来 了 吸 引 潜 在 访 问 者 的 更 多 工 具 。 在 许 多 情 况 下 , 你 可 以 得 到 各 种 功 能 而 无 须 编 写 一 行代码。很显然,第一个要问的问题是 ,“谁关心这些事呢”?答案是想开发内联网或 Internet 站点的所有公司。一项最近的调查表明,当今 48 % 的公司正在部署 Internet 上的应用, 14 %
的 公 司 声 称 他 们 将 在 未 来 的 六 个 月 中 部 署 Internet 应 用 , 28 % 的 公 司 计 划 在 一 年 内 部 署
Inte rnet 应用 (总的百分比达到 78 % )。显然,人们对 Internet 上的应用兴趣很大。
这 个 版 本 的 Visual C++ 还包括了支持应用程序中嵌入浏览器功能。你可以在多种场合使用浏览器支持功能,包括在你的 Web 服务器上放置帮助文件,以便用户在需要的时候就能 访 问 它 们 。 想 一 想 把 桌 面 帮 助 浏 览 器 置 入 应 用 程 序 中 带 来 的 好 处 吧 。 单 单 支 持 电 话 的 减少 所 带 来 的 好 处 就 足 以 说 明 应 该 把 浏 览 器 置 入 应 用 程 序 中 。 这 一 浏 览 器 支 持 功 能 还 使 旅 途中 的 雇 员 能 够 向 公 司 上 载 数 据 和 从 公 司 下 载 诸 如 最 新 的 销 售 统 计 以 及 情 况 分 析 之 类 的 信息。
为 什 么 Internet 会 成 为 这 样 一 种 炙 手 可 热 的 环 境 呢 ? 另 一 项 调 查 询 问 商 业 客 户 为 什 么他 们 要 使 用 Internet 提 供 某 种 类 型 的 增 值 服 务 或 为 雇 员 提 供 更 好 的 信 息 访 问 。 被 调 查 者 中79% 的人认为 Internet 易于使用 。访问 Internet 上海量信息所要完成的一切工作就是找个 ISP
( Internet 服务提供商)和浏览器。浏览器在安装上并不比任何其它 Windows 应用困难 —
— 并且有时候还要容易些。而且,有些 ISP 提供了自动化程度很高的安装程序,用户只需要提供姓名、地址以及诸如信用卡号码这样的付帐信息即可。例如,我最近使用过的 Pacific Bell 安装程序自动创建 Windows 95 下我所需要的连接,然后拨号登录到它们的 Web 站点来帮助我查找最佳的访问号码,并在检查了另一个 Web 站点后完成安装过程。
基 于 用 户 使 用 Internet 的 统 计 数 据 , Microsoft 正 投 资 于 把 分 布 式 数 据 库 支 持 添 加 到Visual C++ 中。本书中介绍的 OLE-DB 和 A D O 将会告诉你, Microsoft 如何把建立与数据库的连接变得更加容易些,而无论这些数据库放置在什么地方。如果 OLE-DB 连接的提供商允许的话,你甚至可以在 Internet 建立与数据库的连接。
显 然 , 如 果 说 易 于 使 用 是 人 们 选 择 使 用 Internet 的 原 因 之 一 的 话 , 那 么 许 多 公 司 都 会有许多使用 Internet 的其它原因。然而,调查中发现使用 Internet 还有其它原因,包括增加
了可用性 ( 69% )、利用了现有基础设施 ( 65% )、成本 ( 51% ),以及易于维护 ( 36% ) 。这项调查允许读者进行多项选择,因此会有上述的百分比。 Internet 起到了信息中心仓库的作用,并且或许是绝大多数公司为远程雇员提供访问公司数据库的最佳途径。
任 何 程 序 员 都 知 道 , 代 码 已 经 能 够 运 行 并 不 足 以 说 明 应 用 程 序 已 经 编 写 完 成 。 还 有 许多 美 学 方 面 的 考 虑 。 比 如 , 可 以 编 写 出 运 行 速 度 更 快 的 代 码 , 也 可 以 缩 减 可 执 行 代 码 的 长度 。 事 实 上 , 编 写 小 型 、 紧 凑 代 码 是 专 家 级 程 序 员 的 标 志 。 这 是 个 极 为 重 要 的 目 标 , 贯 穿于本书的主题就是如何精炼每一行代码。
编 程 语 言 的 选 择 决 定 了 程 序 员 在 应 用 程 序 中 都 能 完 成 哪 些 工 作 以 及 以 怎 样 的 速 度 完 成这些工作。 Visual C++ 一向以灵活著称:理论上使用 Visual C++ 可以完成任何任务,并且不会 让 你 的 代 码 变 得 像 意 大 利 式 细 面 条 那 样 乱 做 一 团 。 C++ 还 以 正 确 使 用 时 能 够 创 建 出 运 行速 度 极 快 的 应 用 程 序 而 著 称 。 然 而 , 这 些 高 度 的 灵 活 性 和 快 的 速 度 经 常 给 初 出 茅 庐 的 程 序员带来麻烦,也经常形成微妙的故障。许多 Visual C++ 的反对者也指出使用这种语言时需要很长的开发周期 — — 这是使用诸如 Visual Basic 之类的 RAD (快速应用开发)语言进行编程的用户注意不多的事实。
有 些 人 走 得 远 了 些 , 声 称 C++ 的 日 子 屈 指 可 数 。 快 速 的 计 算 机 并 不 像 以 前 那 样 需 要 既小 且 快 的 代 码 。 而 且 , 随 着 应 用 程 序 越 来 越 复 杂 , 在 合 理 的 时 间 期 限 内 完 成 应 用 程 序 是 基本的要求。 C++ 应用程序过长的开发和调试周期确实有点不适应当今的应用程序开发环境。
对 C++ 程序员来说,幸运的是,有些编程任务 RAD 语言永远也代替不了 C++ 。 即 使RAD 语言已经取代 C++ 来开发某些类型的应用程序,但对操作系统服务或设备驱动程序来说 , 程 序 员 依 然 需 要 编 写 简 短 、 紧 凑 的 代 码 。 完 成 相 对 底 层 任 务 、 需 要 反 复 执 行 的 代 码 的编制依然是 C++ 程序员的工作领域。
本 书 概 要
我 已 经 有 点 伤 害 你 的 好 奇 心 了 , 现 在 就 让 我 们 看 一 看 本 书 的 主 要 内 容 吧 。 本 书 分 四 个重 点 : 通 用 应 用 程 序 编 程 、 与 Internet 相 关 的 编 程 、 数 据 库 编 程 以 及 应 用 程 序 打 包 。 当 然我们也要花点时间讲述编程基础。例如,我们将考察一下最新版的 Visual C++ 都 提 供 了 哪些界面元素以及新的编程特性。
本书的通用应用程序编程一节将向你展示如何使用 MFC AppWizard 创建基本的应用程序 。我们不花许多时间来研究创建特定类型应用程序的细节 ,但将讲述创建 MFC AppWizard 提供的各种类型的应用程序的方法。显然,在本节中我假定读者已经具备了一定的 C++ 编程经验。当然,我会介绍创建应用程序本身的详细做法,但读者应该知道一些 C++ 的 基 本概念,特别是语言元素方面的知识。
数 据 库 编 程 示 例 将 为 已 经 知 道 一 些 数 据 库 基 本 知 识 的 读 者 提 供 丰 富 的 信 息 。 如 果 你 还不 知 道 什 么 是 表 、 还 没 有 坚 实 地 掌 握 关 系 数 据 库 的 理 论 , 那 么 在 阅 读 本 书 第 二 部 分 之 前 , 需要花点时间先熟悉一下上述内容。我们将研究使用 C++ 操作数据库的基本技巧,你也将理解 ODB C( Open Database Connectivity ,开放数据库互连), OLE-DB ( Ob ject Linking and embedding database ,对象链接与嵌入数据库), A D O ( ActiveX Data Objec t, ActiveX 数据对象)以及 D A O , ( Data Access Objec t,数据访问对象)之间的差别。我们甚至还各花了一章的篇幅来讲述 ODBC 和 A D O 数据库编程。
Internet 编程实际上从本书的第一部分就开始讲述了。这里研究了如何创建基于 H T M L 的 应 用 程 序 。 第 二 部 分 将 讨 论 如 何 创 建 跨 越 Internet 的 数 据 库 连 接 , 然 而 这 里 我 们 并 没 有考 察 任 何 实 际 的 实 例 代 码 。 第 三 部 分 是 介 绍 Internet 的 中 心 章 节 , 我 们 将 以 中 级 程 序 员 的水平来研究 ActiveX 编程。如果你只是个初级程序员,那么会发现某些概念有点难以理解 。
然而,某些章节,比如第 8 章讲述的 H T M L 编程,将会为各层次的程序员提供帮助。另外 ,
第三部分将向读者展示如何使用 ActiveX Docume n (t
滤器),以及 ISAPI Extension ( ISAPI 扩展)。
ActiveX 文档 ),ISAPI Filte r( ISAPI 过
在 第 四 部 分 , 我 们 将 讨 论 从 安 全 性 问 题 到 把 帮 助 文 件 组 合 在 一 起 的 方 方 面 面 的 内 容 。实 际 上 , 我 们 还 要 探 讨 Visual C++ 中 使 用 帮 助 文 件 的 两 种 不 同 技 巧 : 标 准 的 帮 助 文 件 和M icrosoft 正在其产品中使用的新型 H T M L 帮助文件。你还将学习发行应用程序的方法,即使在企业环境中这也是一项不可或缺的任务。
通过本书,你将会深入理解 C 编程语言,虽然它还不至于让你成为一名 C 编程高手。本书中你不会找到很多初级的编程知识,但具备一定 C 编程技能的任何人都会理解本书的内容。积极建议读者已经具备 Microsoft Visual C++ 的一定知识,原因在于所有的示例都以Visual C++ 作为基础 。即使我们把示例控制在基本编程技巧的范围内 ,也依然需要编写 OCX 或 DLL 的知识。如果在你阅读本书之前已经掌握了一些底层编程知识,那么你就会很快地学 会 掌 握 提 供 的 各 种 信 息 。 再 说 一 句 , 本 书 包 含 了 一 些 “ 课 程 复 习 ” 风 格 的 示 例 , 但 它 们也没有提供很多的初级信息。
当然,上面介绍的仅仅是本书的概貌,在这本书中你会找到能够把 Visual C++ 的 功 能发挥得淋漓尽致的各种各样的有用技巧和提示。
本 版 著 作 的 新 内 容
本 书 新 内 容 想 法 的 产 生 主 要 有 三 个 来 源 。 首 先 , 我 花 了 大 量 的 时 间 阅 读 读 者 发 送 来 的电子邮件 。读者的电子邮件对我编著的每一部书籍都显著地丰富了其内容 。第二 ,Visual C++ 本身为我提供了一些想法。我必须在本书中覆盖 Visual C++ 的 所 有 新 特 性 。 最 后 , 我 花 了
大 量 的 时 间 阅 读 各 种 Visual C++ 新闻组以查找新的消息线索。某些消息线索十分正规,它们指出了人们使用 Visual C++ 经常遇到的问题。
第 1 章的绝大部分内容都是全新的。我重新编写了第 1 章,以便提供本版 Visual C++ 的 各 种 新 特 性 的 完 整 概 览 。 另 外 , 本 章 的 某 些 部 分 重 新 进 行 了 排 版 , 以 便 能 够 以 更 便 于 阅读 的 形 式 向 用 户 提 供 信 息 。 我 竭 力 以 更 佳 的 方 式 安 排 插 文 和 表 格 , 让 读 者 能 够 更 快 速 地 找到所需信息。
某 些 读 者 抱 怨 说 , 在 本 书 的 先 前 版 本 中 我 过 多 地 讲 述 语 言 的 新 特 性 而 忽 略 了 普 通 的 编程需要。在本版中,你会发现大大增强了普通应用程序编程材料。第 2 章 和 第 3 章中提供了几节新材料,并提供了一个新的示例程序。
本 书 的 数 据 库 部 分 已 经 进 行 了 几 个 方 面 的 修 订 。 虽 然 D A O 依 然 是 一 种 可 靠 的 技 术 , 然而它已经过时了 。我使用新的 OLE-DB 和 A D O 技术取代了先前书中的 DAO 一节 。另 外 , 阐述数据库的章节着重介绍如何通过 Web 服务器连接到数据库上,而不是介绍如何通过传统的网络路由器连接到数据库上。
本书的 Internet 部分也包含了与新技术和改进技术相关的信息。例如,在第 8 章中讨论了 C O M + 。我还提供了一些 Active Template Library ( ATL ,活动模板库)的信息。
本书 Internet 部分最大的变化出现在第 13 章。许多读者表示他们希望看到有关 ISAPI 的更详细材料,希望找出如何利用 ISAPI 更有效地使用 W eb 服务器。这一章提供了 ISAPI 的更多信息和两个新的编程示例,其中的第二个 ISAPI 过滤器示例显示了如何给你的 W eb 服务器增加安全功能。
本书的第五部分也有许多变化,其中最明显的改变是第 15 章讨论的基于 H T M L 的帮助。在这里你不仅能够学会如何创建基于 H T M L 的帮助,而且也将学会如何把这种帮助添加 到 你 的 应 用 程 序 中 。 除 了 可 以 提 供 更 佳 的 帮 助 信 息 外 , 你 还 会 发 现 安 全 方 面 和 打 包 方 法
的 更 新 。 总 而 言 之 , 这 部 分 的 更 新 内 容 可 以 帮 助 你 向 使 用 你 开 发 的 应 用 程 序 的 人 们 提 供 更多、更好的应用程序支持。
系 统 需 求
如 果 你 只 是 对 本 书 的 第 一 、 第 二 以 及 第 四 部 分 感 兴 趣 , 那 么 阅 读 本 书 所 需 的 一 切 就 是一份 M icrosoft Visual C++ 的拷贝。由于我在每个示例中都试图使用 Visual C++ 的新特性, 因此,在绝大多数情况下你都不能使用该产品的老版本 (对某些示例来说, Visual C++ 5.0 勉强能用)。无论你使用何种版本的 Window s,一定要确保安装了最新的补丁包和服务包 。在测试本书的示例时,我使用的是 W indows 95 的 OSR2 版本和安装了服务包 3 的 Windows NT 4 。
如果你打算使用第 14 章的 Internet 信息服务器 ( Internet Information Server , IIS ) 示例,那么一定要安装 W indows NT Server 4 ,并使用服务包 3 进行升级。你还需要在服务器上运行 IIS 4.0 。某些示例代码根本不能与以前版本的 IIS 一 起 工 作 。 第 14 章中的所有示例均假定你使用的是功能完备的 IIS ,而不是其它的替代品。
注 释 本 书 中 你 将 学 习 的 许 多 概 念 在 联 机 文 档 中 根 本 就 没 有 。 某 些 概 念 十 分 新 颖 , 它们只在一些有选择的 Web 站点上出现。对这样的信息,本书将采用技巧或注释的方式告诉读者它们的地址。另外,有些材料 Microsoft 只 通 过 像 MSDN 订 户这 样 的 有 选 择 渠 道 进 行 发 布 。 其 它 一 些 信 息 则 未 被 公 开 , 除 了 在 新 闻 组 中 某 些人偶然发现这些特性外,在其它的任何地方你都找不到它们。
你还需要一台运行 Windows 95/98 或 Windows NT 的计算机作为工作站。你的 Web 服务 器 和 工 作 站 都 要 求 有 足 够 的 内 存 和 其 它 资 源 以 支 持 本 书 中 用 到 的 各 种 工 具 。 也 就 是 说 , 在绝大多数情况下 ,你的计算机的最低配置应该是 200 MHz 的 Pentium MMX 、6 4 M B 内 存 、至少 3GB 的硬盘空间。虽然你可以降低上述配置,在编写和测试代码时低端计算机会很快让你陷入泥潭之中。我已经在 Pentium 166MH z, 32MB 内存的计算机上运行过 Visual C++ , 但性能让人感到恐怖。
本 书 使 用 的 约 定
本 节 讨 论 用 法 约 定 。 在 我 们 研 究 匈 牙 利 表 示 法 和 如 何 使 用 这 种 表 示 法 时 , 我 们 将 讨 论编程约定。本书使用下述约定:
|
[<Filename>] |
当 方 括 号 括 住 某 个 值 、 某 个 开 关 或 某 个 命 令 时 , 表 示 该 项 是 个 可 选 项 。 只 有 当 你 想 用 相 应 的 值 、 开 关 或 命 令 提 供 的 功 能时,才需要把该项包括到命令行或对话框域中 |
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
<Filename> |
尖 括 号 中 间 的 变 量 名看 到 的 变 量 名 通 常 是 提 示边 的 示 例 来 说 , 它 表 示 你时,千万不要键入尖括号 |
是词需 |
个语要 |
需 , 提 |
要你供 |
使需一 |
用要个 |
实提文 |
际供件 |
值相名 |
代应 。 |
替的在 |
的信键 |
名息入 |
称 。对 |
。对应 |
你左值 |
续表
|
全 部 为 大 写字母 |
在 三 种 情 况 下 你 会 看 到 全 部 是 大 写 字 母 : 命 令 、 文 件 名 以及大小写敏感的登记项。通常在 D O S 提示符、 PIF 文件域、 Run 对 话 框 域 中 键 入 命 令 。 如 果 你 在 其 它 地 方 看 到 了 全 大 写 字 母 , 你 可 以 安 全 地 假 定 它 们 是 大 小 写 敏 感 的 登 记 项 或 像 文 件 名 这 样的其它一些值 |
|---|---|
|
File|Open |
菜单和从菜单中进行的选择。 “ File|Open ”表示 “访问 File 菜单,并选择 Open 菜单项” |
|
斜体字 |
在 三 种 场 合 你 会 看 到 斜 体 文 字 : 新 词 、 多 值 项 以 及 不 确 定的 值 。 无 论 何 时 , 当 实 际 值 未 知 时 , 总 使 用 斜 体 字 表 示 这 个 值 。书 中 在 多 个 值 都 可 能 正 确 的 情 况 下 也 使 用 斜 体 字 印 刷 , 例 如 , 书 中 你 会 看 到 FILExxxx , 它 表 示 相 应 值 可 以 是 FILE0000 到 FILE9999 之间的任何值 |
|
等 宽 字 体 文字 |
将 要 在 宏 中 输 入 的 文 本 或 在 命 令 行 上 键 入 的 文 本 与 解 释 它们 的 文 字 区 分 开 来 是 相 当 重 要 的 , 本 书 使 用 等 宽 字 体 来 区 分 两者 。 当 你 看 到 等 宽 字 体 的 文 字 时 , 就 表 示 这 些 信 息 要 出 现 在 宏中,包含在像 CONFIG.SYS 或 A U T O EXEC.BAT 这样的系统文件中或者是需要在命令行上键入的文本。你甚至会看到 Windows 命 令 中 的 开 关 也 使 用 这 种 风 格 的 文 本 。 还 有 一 种 情 况 使 用 等 宽字 体 格 式 的 文 本 。 每 一 个 代 码 列 表 均 使 用 等 宽 字 体 , 这 样 更 易于 阅 读 。 使 用 等 宽 风 格 的 文 本 还 使 得 易 于 在 文 本 中 增 加 某 些 东 西,比如代码示例中的缩进 |
标志
本书采用了许多帮助读者区分不同类型信息的标志。下文描述了各标志的用途。
注 释 注 释 告 诉 读 者 一 些 有 趣 的 事 实 , 它 们 并 不 影 响 读 者 使 用 本 书 的 其 它 信 息 。 我 使用注释向读者提供一些在使用 Visual C++ 、 Windows NT 或 Windows 95 时 收 集到的一些有用信息。
技 巧 每 个 人 都 喜 欢 技 巧 , 原 因 在 于 它 们 会 告 诉 读 者 一 些 完 成 某 项 任 务 时 以 前 或 许 从未 想 到 的 方 法 。 技 巧 框 还 提 供 了 完 成 某 项 任 务 的 另 一 条 途 径 , 读 者 或 许 会 认 为这一条途径比正文中提到的方法更好。
警 告 它 表 示 你 要 留 神 了 。 警 告 几 乎 总 是 要 告 诉 读 者 , 如 果 你 要 完 成 某 项 操 作 ( 或 不能 完 成 其 它 操 作 ) 时 , 将 会 引 发 某 些 系 统 破 坏 或 数 据 损 坏 。 在 你 执 行 警 告 词 语之后的任何指令之前,一定要确保彻底地理解了这个警告。
Web 链接 Internet 包含了丰富的信息,但最低限度上说,找到这些信息是比较困难的。 Web 链接帮助读者在 Internet 上找到能够提高读者编程能力或能够学到新的编程技巧的新的信息资源。读者还会发现一些新闻组的 Web 链接,它告诉你在什么地方可以找到谈论 Visual C++ 的其他人群。最后, Web 链接还会帮助读者找到一些能够使编程工作比以前更快、更容易的实用程序。
可移植性 保 证 代 码 能 够 在 各 种 情 况 下 和 各 种 平 台 上 运 行 总 是 个 美 好 的 理 想 。 当 你 看到 这 个 标 志 时 , 它 提 醒 你 一 些 把 代 码 或 可 执 行 文 件 从 一 台 机 器 上 迁 移 到 另 一 台机 器 上 时 可 能 存 在 的 问 题 。 如 果 你 的 代 码 要 在 多 台 不 同 类 型 的 机 器 上 运 行 或 要在 多 种 操 作 系 统 环 境 中 运 行 的 能 力 对 你 来 说 十 分 重 要 的 话 , 一 定 要 特 别 留 意 这种类型的标志。
高级技巧 高 级 技 巧 框 中 包 含 了 一 些 额 外 的 信 息 , 即 使 你 不 知 道 这 些 信 息 , 也 并 不 影响 你 编 写 出 优 质 的 程 序 。 高 级 技 巧 框 为 中 级 和 高 级 程 序 员 提 供 了 一 些 有 趣 的 资料,他们可以使用这些资料来增强其应用程序的功能或提高自己的生产效率。
本 书 中 读 者 还 会 看 到 各 种 旁 注 。 它 们 描 述 了 在 你 开 始 某 个 过 程 或 完 成 其 它 任 务 前 应 该记 住 的 一 段 信 息 。 旁 注 还 包 含 了 一 些 诸 如 文 件 位 置 或 应 该 查 看 某 个 示 例 程 序 的 某 些 内 容 这样 有 用 的 琐 碎 信 息 。 在 绝 大 多 数 情 况 下 , 旁 注 是 简 单 实 用 的 信 息 宝 藏 , 你 可 以 利 用 它 提 高你的整体编程水平。
匈牙利表示法概述
密码 — — 间谍电影和其它各种人类活动的基本素材。当你第一次看到匈牙利表示法时 , 你 可 能 会 把 它 当 成 另 一 种 密 码 。 该 表 示 法 包 含 了 密 码 的 一 切 要 素 , 其 中 包 括 一 系 列 不 得 不解 码 的 神 秘 字 符 以 及 使 用 时 几 乎 不 能 破 译 的 结 果 。 然 而 , 不 久 你 就 会 明 白 , 这 是 其 他 程 序员的秘密代码,而不是本书中使用的匈牙利表示法。
匈 牙 利 表 示 法 可 以 为 你 节 省 大 量 的 时 间 和 精 力 。 在 编 程 方 面 花 过 大 量 时 间 的 任 何 人 都
知 道 , 当 阅 读 以 前 自 己 编 写 的 代 码 或 阅 读 其 他 人 编 写 的 代 码 时 , 好 的 文 档 是 无 价 之 宝 。 这也正是匈牙利表示法要为你完成的任务 — — 文 档 化 代 码 。
对匈牙利表示法的清晰理解将有助于你从本书的示例以及 M icrosoft (以及其他厂商) 的手册中学到更多深入的东西。每一个 Windows 编程语言厂商都在其手册中使用某种形式的匈牙利表示法 。另外 ,相同的概念同样适用于诸如 Visual FoxPro ,Delphi 以及 Visual Basic 这 样 的 编 程 语 言 。 即 使 语 言 本 身 完 全 不 同 , 但 使 用 匈 牙 利 表 示 法 编 写 出 的 代 码 超 越 了 编 程语言而具备一定的相似性。
那 么 , 严 格 讲 起 来 , 什 么 是 匈 牙 利 表 示 法 呢 ? 匈 牙 利 表 示 法 是 一 种 告 诉 其 他 人 你 准 备如 何 使 用 变 量 的 表 示 方 法 。 知 道 了 变 量 要 干 些 什 么 经 常 有 助 于 解 释 代 码 本 身 。 例 如 , 如 果我 告 诉 你 某 个 特 定 变 量 保 存 了 某 个 窗 口 的 句 柄 , 那 么 这 就 比 变 量 只 简 单 地 是 个 变 量 提 供 了更多的信息。理解了该变量将操作窗口后,你就可以解释代码了。
这种变量命名系统第一阶段的开发工作是由 M icrosoft 公司的 Charles Simonyi 完 成 的 。他把这种命名系统称做匈牙利表示法 ( Hungarian Notation ),我们在这里就使用这种称呼 。你可以从许多地方获取 Charles Simonyi 著作的副本 ,包括 BBS 和 Internet 上的某些 Microsoft 编程站点 (像 CompuServer 这样的许多联机服务也以各种形式提供匈牙利表示法的副本) 。其他开发人员对 Simonyi 的研究成果做了进一步的增强。例如, Xbase 程 序 员 使 用 他 们 自己 特 殊 版 本 的 匈 牙 利 表 示 法 。 这 种 表 示 法 表 达 了 Xbase 提 供 的 不 同 类 型 的 变 量 。 Fresh Tec h nologies 的 Robert A. Difalco 出版了匈牙利表示法的 Xbase 增强版本 。在某些针对 D B M S 的 BBS 上以及 CompuServer 的 Computer Associates Clipper 论坛上你都可以找到这位作者的作品。
本 节 讲 述 的 基 本 概 念 在 前 面 提 到 的 两 个 文 档 中 你 都 可 以 查 阅 到 , 表 达 形 式 上 可 能 会 有
所 不 同 。 本 节 旧 话 重 提 的 目 的 是 为 了 让 你 准 确 地 理 解 我 所 采 用 的 约 定 的 意 义 , 并 说 明 在 你
的代码中应该如何最佳地使用它们。在你的代码中采用这种命名法的原因有四个:
帮 助 记 忆 值 这 种 表 示 法 有 助 于 更 容 易 地 记 住 变 量 的 名 称 , 在 团 队 项 目 中 这 是 个要认真考虑的重要事情。
提 供 建 议 值 你 或 许 并 不 是 唯 一 要 修 改 你 的 代 码 的 人 。 如 果 你 正 在 开 发 一 个 团 队项 目 的 话 , 小 组 中 的 其 他 成 员 最 起 码 也 要 看 一 看 你 编 写 的 代 码 。 使 用 这 些 约 定 有助于其他开发人员理解你的代码。
一 致 性 程 序 员 的 工 作 成 果 通 常 并 不 仅 仅 体 现 在 效 率 和 功 能 方 面 , 而 且 也 体 现 在编 写 出 的 代 码 是 否 能 够 被 其 他 程 序 员 轻 易 地 读 懂 。 使 用 这 些 约 定 有 助 于 在 不 同 的项 目 中 保 持 一 致 的 代 码 风 格 。 利 用 你 所 使 用 的 约 定 , 其 他 程 序 员 也 可 以 轻 易 地 加入到修改或编写代码的行列中。
加 快 判 断 速 度 在 商 业 化 世 界 中 , 创 建 和 修 改 代 码 的 速 度 经 常 会 决 定 特 定 项 目 的成 功 程 度 。 使 用 一 致 的 代 码 将 减 少 你 花 在 猜 测 其 他 人 创 建 的 变 量 或 函 数 意 义 方 面所需的时间。这一判断时间的减少也就增加了你用于有效地开发产品的时间。
上 面 已 经 讲 述 了 为 什 么 应 该 使 用 匈 牙 利 表 示 法 , 现 在 让 我 们 看 一 看 本 书 中 准 备 如 何 应用 这 一 表 示 法 吧 。 我 将 按 照 下 节 阐 述 的 规 则 命 名 变 量 。 在 命 名 数 据 库 字 段 或 其 它 与 值 相 关的 结 构 时 我 也 将 使 用 这 些 规 则 。 另 外 , 只 要 匈 牙 利 表 示 法 有 助 于 更 清 晰 地 表 达 函 数 和 过 程的意义,这些函数和过程的命名也将使用下节中介绍的规则。
规则 1 :使用变量前缀
变 量 命 名 时 , 总 使 用 一 个 或 两 个 小 写 字 母 作 为 变 量 名 前 缀 , 以 指 明 变 量 的 类 型 。 绝 大多 数 情 况 下 , 变 量 名 前 缀 使 用 变 量 类 型 的 第 一 个 字 母 , 因 此 , 可 以 轻 易 地 记 住 应 该 使 用 哪个字母 。下面的示例显示了 Visual Basic ,Delphi 以及 C 语言中普遍使用的前缀字 母( W indows
中有成千上万种文字组合没有在这里列出)。下表也提供了几个数据库专用的修饰符:
| a | Array |
|---|---|
| c | Character |
| d | Date |
| dbl | Double |
| dc | Device Context |
| dw | Double Word |
| f | Flag,Boolean 或 Logical |
| h | Handle |
| i | Integer |
| inst | Instance |
| l | Long |
| li | Long Integer |
| lp | Long Point |
| msg | M essage |
| n | Numeric |
| o | Object |
| pal | Palette |
| psz | 指向以零结尾的字符串的指针 ( Pointer) |
| ptr |
指针 (与其它类型变量一起使用时也可以使用 p ,比如 psz ) |
| r | Real |
续表
| rc | Rectangle |
|---|---|
| rgb | Red,Green,Blue (红、绿、蓝,颜色变量) |
| rsrc | Resource |
| sgl | Single |
| si | Short Integer |
| sz | Zero Terminated String |
| u | Unsigned |
| ui | Unsigned Integer 或 Byte |
| w | Word |
| wnd | W indow |
规则 2 :标识状态变量
某 些 变 量 用 于 指 明 像 数 据 库 、 字 段 或 控 件 这 样 的 对 象 的 状 态 。 这 些 变 量 甚 至 可 以 保 存其 它 变 量 的 状 态 。 告 诉 其 他 程 序 员 某 个 变 量 用 于 监 视 某 个 对 象 的 当 前 状 态 有 助 于 他 们 理 解这些变量在程序中的意义。你可以使用下面的三字母修饰符之一来指明该变量是状态变量:
| New |
新的状态 |
|---|---|
| Sav |
已保存状态 |
| Tem |
临时状态 |
规则 3 :应用标准修饰符
标准修饰符几乎可以让其他人立即看清楚变量的用途。标准修饰符不提供变量的类型
信 息 , 但 它 们 说 明 了 一 个 变 量 与 其 它 变 量 之 间 的 关 系 。 例 如 , 使 用 Clr 修饰符将会告诉阅读 程 序 的 人 该 变 量 以 某 种 方 式 用 于 操 作 颜 色 。 你 甚 至 可 以 把 多 个 修 饰 符 组 合 起 来 以 进 一 步说明变量的作用并描述清楚应该如何使用这个变量。例如, cClrCrs 是个字符型变量,它用于 确 定 光 标 的 显 示 颜 色 。 使 用 一 到 三 个 这 样 的 修 饰 符 通 常 就 足 以 描 述 清 楚 变 量 的 用 途 了 。下面列出的修饰符是应用最普遍的一些修饰符:
| Ar |
Array |
|---|---|
| Attr |
Attribute |
| B |
Bottom |
| Clr |
Color |
| Col |
Column |
| Crs |
Cursor |
| Dbf |
Database File (数据库文件) |
| F |
First |
| File |
File |
| Fld |
Field |
| L |
Last/Left |
| Msg |
Message |
| Name |
Name |
| Ntx |
Index File (索引文件) |
| R |
right |
| Rec |
Record Number (记录号) |
续表
| Ret |
Return Value (返回值) |
|---|---|
| Scr |
Screen |
| Str |
String |
| T |
Top |
| X |
Row |
| Y |
Column |
规则 4 :添加描述性文字
当 你 清 楚 地 定 义 了 变 量 的 内 容 和 用 途 后 , 就 可 以 使 用 一 些 描 述 性 的 文 字 进 一 步 精 化 这些 定 义 。 例 如 , 你 可 以 把 指 向 用 于 保 存 雇 员 姓 名 的 字 符 串 的 长 型 指 针 变 量 定 义 为 : lpszEm p Name 。 这 个 变 量 的 前 两 个 字 母 告 诉 我 们 它 是 个 长 型 指 针 , 紧 接 着 的 两 个 字 母 告 诉我 们 这 是 个 以 零 ( 或 空 ) 结 尾 的 字 符 串 , 其 余 的 字 母 告 诉 我 们 它 是 个 雇 员 姓 名 ( 请 注 意 , 在 这 个 示 例 中 我 使 用 了 标 准 修 饰 符 Name ) 。 在 代 码 中 看 到 这 样 的 变 量 名 让 人 一 眼 就 可 以看出其类型和用途。
规则 5 :创建多个变量
时 不 时 就 会 遇 到 在 某 个 特 定 模 块 中 使 用 一 个 变 量 并 不 能 够 满 足 每 一 种 需 要 的 情 况 。 多数 情 况 下 你 会 想 到 创 建 同 种 类 型 的 多 个 变 量 , 并 用 数 字 来 区 分 这 些 变 量 。 当 然 你 也 可 以 使用下面的这种有意义的数字指示符来说明各变量的功能:
| 1 , 2 , 3 |
状态指针引用,比如 cSavClr1 , cSavClr2 , |
|---|---|
| Max |
限制上界,比如 nFldMax 指明字段的最大个数 |
| Min |
限制下界,比如 nRecMin 指明记录的最小个数 |
| Ord |
某种类型的顺序号 |
