一、 Windows CGI
---- 通 用 网 关 接 口CGI 是 服 务 器 与 应 用 程 序 之 间 的 接 口, 在 编 写HTML 文 件 时 可 结 合 其 他 程 序 语 言 使 客 户 通 过 浏 览 器 将 数 据 输 入 到 文 件 里, 经 服 务 器 处 理 后 转 送 给 客 户 或 记 录 在 服 务 器 的 数 据 库 中。 任 何 一 种 程 序 设 计 语 言 写 的 程 序, 若 可 在 服 务 器 主 机 上 运 行 并 可 用CGI 接 口 来 传 递 数 据, 就 可 作 为CGI 应 用 程 序, 这 种 语 言 可 被 称 为CGI 程 序 语 言 或 脚 本 语 言(scripting language); 目 前 最 受 欢 迎 的CGI 程 序 语 言 有:C/C++, shell Script, Perl, 和Visual Basic, 此 外 还 有Fortran, TCL, AppleScript 等。
---- CGI 接 口 因 平 台 不 同 而 不 同。Windows 平 台 的CGI 称 为Windows CGI。 美 国 的Bob Denny 从 需 要 实 现CGI 接 口 来 处 理Windows 应 用 方 面 的 要 求 入 手 设 计 实 现 了Windows CGI, 开 发 出 目 前 在Windows95 和Windows NT 平 台 上 很 受 欢 迎 的HTTP 服 务 器:WebSite;Bob Denny 用VB4.0 写 的Windows CGI 接 口 程 序 名 为CGI32.BAS, 是 一 个 给 用 户 在Windows 95 或Windows NT 环 境 下 用Visual Basic 来 开 发Windows CGI 应 用 程 序 的 接 口, 主 要 处 理WWW 服 务 器( 如:WebSite, Netscape, Alibaba 等) 与CGI 程 序 之 间 的 数 据 交 换: 在VB 中 通 过Windows CGI 接 口 处 理HTML 的 表 单 传 过 来 的 变 量, 并 把 处 理 结 果 通 过Windows HTTP Server 再 传 给 客 户 机 上 的 浏 览 器, 从 而 达 到 信 息 交 互 目 的。
---- 由 于Windows 没 有 命 令 解 释 器(command interpreter), 所 以Windows CGI 程 序 都 必 需 编 译 为 可 执 行 文 件 在 服 务 器 上 运 行。
---- 除VB 外, 可 以 在Windows 上 用 来 写Windows CGI 程 序 的 语 言 还 很 多, 例 如: Delphi, Perl, VC++ 等; 目 前Visual Basic 得 以 流 行, 是 因 为 该 语 言 不 仅 在Windows 用 户 中 很 普 及, 而 且 最 早 被 发 表 为 撰 写Windows CGI 程 序 的 标 准, 同 时 该 语 言 支 持 许 多Windows 环 境: 例 如OLE, DDE,Sockets, ODBC 等; 此 外,VB 应 用 程 序 可 在 不 需 要 窗 体(windows forms) 而 只 在 模 组(modules) 的 环 境 下 开 发, 十 分 符 合CGI 应 用 程 序 的 需 要。
---- 以 前, 多 用VB4.0(32 位 版) 开 发Windows CGI 应 用 程 序, 由 于VB5.0 的 推 出, 用VB5.0 写Windows CGI 应 用 程 序 更 为 简 单、 方 便 和 有 力。
---- 要 在Windows 95/NT 的PC 微 机 上 运 行Windows CGI 程 序 必 须 在PC 机 上 安 装 一 个 支 持Windows CGI 的 服 务 器, 例 如WebSite;WebSite 是 一 个 基 于Windows95/Windows NT 运 行 的32 位、 多 线 程 的 服 务 器, 功 能 强 大、 使 用 方 便, 完 全 满 足 小 单 位 或 个 人 建 立PC 服 务 器 的 要 求。 有 关 它 的 最 新 信 息 和 免 费 试 用 版 可 从 http://website.ora.com/ 获 取。
二、 用VB5.0 编 制Windows CGI 应 用 程 序 的 具 体 步 骤
---- Denny 用Visual Basic 4.0(32 位 版) 开 发 了 一 个Windows CGI 库 模 块:CGI32.BAS, 它 与WebSite 软 件 一 道 提 供 使 用( 安 装WebSite 时CGI32.BAS 被 放 在c:\website\lib 下, 很 容 易 找 到);CGI32.BAS 为Windows 95/Windows NT 下 用VB4.0 开 发Windows CGI 程 序 设 计 提 供 了 极 大 的 方 便; 目 前 微 软 推 出 了 功 能 更 强 大 的Visual Basic5.0, 本 文 通 过 例 子 介 绍 在CGI32.BAS 下 用VB5.0 编 写Windows CGI 应 用 程 序 的 方 法, 通 过 这 些 例 子 可 以 看 出 用VB5.0 来 编 写Windows CGI 应 用 程 序 比VB4.0 更 为 有 力 和 简 单。
---- 下 面 首 先 介 绍 一 个 最 简 单 的Windows CGI 程 序 以 及 将 它 编 译 为 可 执 行 文 件 放 于 服 务 器 应 用 的 方 法, 这 些 方 法 是 一 般 的, 对VB 编 写 的Windows CGI 程 序 普 遍 实 用。 程 序 由 两 个 子 过 程CGI_Main() 和Inter_Main() 构 成, 子 过 程CGI_Main() 功 能 是 在 服 务 器 端 产 生 一 个HTML 页 面 并 送 回Web 客 户, 这 个 页 面 显 示 了 两 行 汉 字 和 服 务 器 时 间, 是Windows CGI 程 序 的 入 口, 是 必 不 可 少 的; 另 一 个 子 过 程Inter_Main() 提 示 该 程 序 必 须 在Web 服 务 器 中 运 行。 源 程 序 代 码 如 下:
Sub CGI_Main()
Send ("Content-type: text/html")
Send ("")
Send ("< HTML >< HEAD >< TITLE >
欢迎< /TITLE >< /HEAD >")
Send ("< BODY >")
Send ("< H1 ALIGN=CENTER >
< FONT COLOR='#FF0080' >
欢迎您访问< /FONT >< /H1 >")
Send ("< H1 ALIGN=CENTER >
< FONT COLOR='#FF0080' >
贵州大学计算机软件与理论研究所
< /FONT >< /H1 >")
Send ("< HR WIDTH='100%' >")
Send ("< P >< H2 >< FONT COLOR='#000000' >
您访问的时间是:" & Now)
Send ("我们的WWW网址:
< A HREF='http://www.gzu.edu.cn/
~lixiang/index.html' >
www.gzu.edu.cn/~lixiang/index.html< /A >")
Send ("我们的Email地址:
< A HREF='mailto:lixiang@gzu.edu.cn' >
lixiang@gzu.edu.cn")
Send ("< /H2 >< /BODY >< /HTML >")
End Sub
Sub Inter_Main()
MsgBox "这是CGI程序,需在Web服务器上运行."
End Sub
---- 现 在, 介 绍 在VB5.0 集 成 开 发 环 境 里 编 辑、 编 译、 调 试 该Windows CGI 应 用 程 序 并 生 成 可 执 行 文 件 放 入 服 务 器 中 在 网 上 使 用 的 具 体 步 骤:
---- 1 建 立 项 目(Project): 运 行VB5.0, 在 主 菜 单 选“ 文 件(F) | 新 建 工 程(N)”, 在 出 现 的“ 新 建 工 程” 对 话 框 中 选“ 标 准 EXE”; 由 于Windows CGI 应 用 程 序 不 需 要 自 己 的 窗 体, 故 在 用VB5.0 建 立 项 目 文 件(Project) 的 上 述 步 骤 后, 在 出 现 的 名 为“ 工 程- 工 程1” 的“ 资 源 管 理 器” 窗 口 中 用 鼠 标 右 击“Form1” 将 其 删 除;
---- 2 添 加 文 件: 在 主 菜 单 选“ 工 程(P) | 添 加 文 件(A)”, 在 出 现 的 添 加 文 件 对 话 框 中 选 择cgi32.bas 所 在 目 录( 例 如c:\website\lib\) 将 其 打 开 加 入 工 程 中;
---- 3 添 加 模 块: 在 主 菜 单 选“ 工 程(P) | 添 加 模 块(M)”, 在 出 现 的 对 话 框 中 将 模 块(Module1) 打 开 加 入;
---- 4 录 入 代 码: 在 模 块 代 码 窗 口 中 录 入 上 面 给 出 的 两 个 子 过 程 的 代 码。
---- 5 保 存 模 块 和 工 程 文 件: 在 主 菜 单 中 选:“ 文 件(F) | 工 程 另 存 为(E)”, 可 对 模 块(Module1.bas) 和 工 程( 工 程1.vbp) 重 新 取 名( 例 如:guida.bas 和guida.vbp) 存 盘;
---- 6 生 成 可 执 行 文 件: 在 主 菜 单 中 选“ 文 件(F) | 生 成 guida.exe(K)”, 在 出 现 的 对 话 框 里 选 好 存 盘 目 录 将guida.exe 存 盘;
---- 7 将 生 成 的 可 执 行 文 件(guida.exe) 放 入 服 务 器: 对WebSite 服 务 器, 应 放 置 在 子 目 录\WebSite\cgi-win\ 里;
---- 8 在Web 客 户 端 运 行 这 个CGI 程 序: 在 本 机 上 运 行, 打 开 浏 览 器, 在URL 栏 中 连 接: http://localhost/cgi-win/guida.exe ; 在 网 上 的Web 客 户 端, 用 http:// 服 务 器 主 机/cgi/guida.exe
三、 用VB5.0 制 作 一 个 网 上 征 求 意 见 的Windows CGI 应 用 程 序
---- 下 面 举 一 个 较 复 杂 实 用 的Windows CGI 程 序, 它 由4 个 子 过 程 组 成:CGI_Main(), EnterGuest(),ReturnForm() 和Inter_Main(); 它 的 功 能 是: 服 务 器 向 申 请 连 接 的Web 客 户 发 出 一 张 表 单,Web 客 户 在 表 单 里 填 入 有 关 数 据 后 送 回 服 务 器, 服 务 器 收 到Web 客 户 的 数 据 并 将 它 们 写 入 一 个 文 件 中 存 储 起 来, 同 时 向Web 客 户 发 送 一 个 收 条。 这 个Windows CGI 应 用 程 序 的 工 作 流 程 如 下: 一 当Web 客 户 要 求CGI 连 接, 服 务 器 运 行 该CGI 程 序, 首 先 执 行 CGI_Main() 过 程,CGI_Main() 过 程 调 用ReturnForm() 向Web 客 户 送 出 一 个 表 单, 如 果Web 客 户 填 了 意 见 表, 并 按 键 寄 回 服 务 器( 此 时 过 程CGI_Main() 中CGI_RequestMethod = "POST" 成 立) 则 由CGI_Main() 过 程 调 用 EnterGuest() 获 取 客 户 发 来 的 数 据 并 将 其 放 入 文 件guestbk.csv 中, 同 时 向Web 客 户 返 回 一 个 信 息 回 条 表 示 客 户 表 单 已 收 到。