📄 202.htm
字号:
<p>用VB编写Windows CGI应用程序 </p>
<p></p>
<p></p>
<p>一、 Windows CGI</p>
<p>---- 通 用 网 关 接 口CGI 是 服 务 器 与 应 用 程 序 之 间 的 接 口, 在 编 写HTML 文 件 时 可 结 合 其 他 程 序 语 言 使 客 户 通 过 浏 览 器 将 数 据 输 入 到 文 件 里, 经 服 务 器 处 理 后 转 送 给 客 户 或 记 录 在 服 务 器 的 数 据 库 中。 任 何 一 种 程 序 设 计 语 言 写 的 程 序, 若 可 在 服 务 器 主 机 上 运 行 并 可 用CGI 接 口 来 传 递 数 据, 就 可 作 为CGI 应 用 程 序, 这 种 语 言 可 被 称 为CGI 程 序 语 言 或 脚 本 语 言(scripting language); 目 前 最 受 欢 迎 的CGI 程 序 语 言 有:C/C++, shell Script, Perl, 和Visual Basic, 此 外 还 有Fortran, TCL, AppleScript 等。</p>
<p>---- 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 再 传 给 客 户 机 上 的 浏 览 器, 从 而 达 到 信 息 交 互 目 的。</p>
<p></p>
<p>---- 由 于Windows 没 有 命 令 解 释 器(command interpreter), 所 以Windows CGI 程 序 都 必 需 编 译 为 可 执 行 文 件 在 服 务 器 上 运 行。</p>
<p></p>
<p>---- 除VB 外, 可 以 在Windows 上 用 来 写Windows CGI 程 序 的 语 言 还 很 多, 例 如: Delphi, Perl, VC++ 等; 目 前Visual Basic 得 以 流 行, 是 因 为 该 语 言 不 仅 在Windows 用 户 中 很 普 及, 而 且 最 早 被 发 表 为 撰 写Windows CGI 程 序 的 标 准, 同 时 该 语 言 支 持 许 多Windows 环 境: 例 如OLE, DDE,Sockets, ODBC 等; 此 外,VB 应 用 程 序 可 在 不 需 要 窗 体(windows forms) 而 只 在 模 组(modules) 的 环 境 下 开 发, 十 分 符 合CGI 应 用 程 序 的 需 要。</p>
<p></p>
<p>---- 以 前, 多 用VB4.0(32 位 版) 开 发Windows CGI 应 用 程 序, 由 于VB5.0 的 推 出, 用VB5.0 写Windows CGI 应 用 程 序 更 为 简 单、 方 便 和 有 力。</p>
<p></p>
<p>---- 要 在Windows 95/NT 的PC 微 机 上 运 行Windows CGI 程 序 必 须 在PC 机 上 安 装 一 个 支 持Windows CGI 的 服 务 器, 例 如WebSite;WebSite 是 一 个 基 于Windows95/Windows NT 运 行 的32 位、 多 线 程 的 服 务 器, 功 能 强 大、 使 用 方 便, 完 全 满 足 小 单 位 或 个 人 建 立PC 服 务 器 的 要 求。 有 关 它 的 最 新 信 息 和 免 费 试 用 版 可 从 http://website.ora.com/ 获 取。</p>
<p></p>
<p>二、 用VB5.0 编 制Windows CGI 应 用 程 序 的 具 体 步 骤</p>
<p>---- 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 更 为 有 力 和 简 单。</p>
<p>---- 下 面 首 先 介 绍 一 个 最 简 单 的Windows CGI 程 序 以 及 将 它 编 译 为 可 执 行 文 件 放 于 服 务 器 应 用 的 方 法, 这 些 方 法 是 一 般 的, 对VB 编 写 的Windows CGI 程 序 普 遍 实 用。 程 序 由 两 个 子 过 程CGI_Main() 和Inter_Main() 构 成, 子 过 程CGI_Main() 功 能 是 在 服 务 器 端 产 生 一 个HTML 页 面 并 送 回Web 客 户, 这 个 页 面 显 示 了 两 行 汉 字 和 服 务 器 时 间, 是Windows CGI 程 序 的 入 口, 是 必 不 可 少 的; 另 一 个 子 过 程Inter_Main() 提 示 该 程 序 必 须 在Web 服 务 器 中 运 行。 源 程 序 代 码 如 下:</p>
<p></p>
<p>Sub CGI_Main()</p>
<p>Send ("Content-type: text/html")</p>
<p>Send ("")</p>
<p>Send ("< HTML >< HEAD >< TITLE ></p>
<p>欢迎< /TITLE >< /HEAD >")</p>
<p>Send ("< BODY >")</p>
<p>Send ("< H1 ALIGN=CENTER ></p>
<p>< FONT COLOR=注释:#FF0080注释: ></p>
<p>欢迎您访问< /FONT >< /H1 >")</p>
<p>Send ("< H1 ALIGN=CENTER ></p>
<p>< FONT COLOR=注释:#FF0080注释: ></p>
<p>贵州大学计算机软件与理论研究所</p>
<p>< /FONT >< /H1 >")</p>
<p>Send ("< HR WIDTH=注释:100%注释: >")</p>
<p>Send ("< P >< H2 >< FONT COLOR=注释:#000000注释: ></p>
<p>您访问的时间是:" & Now)</p>
<p>Send ("我们的WWW网址:</p>
<p>< A HREF=注释:http://www.gzu.edu.cn/</p>
<p>~lixiang/index.html注释: ></p>
<p>www.gzu.edu.cn/~lixiang/index.html< /A >")</p>
<p>Send ("我们的Email地址:</p>
<p>< A HREF=注释:mailto:lixiang@gzu.edu.cn注释: ></p>
<p>lixiang@gzu.edu.cn")</p>
<p>Send ("< /H2 >< /BODY >< /HTML >")</p>
<p>End Sub</p>
<p>Sub Inter_Main()</p>
<p>MsgBox "这是CGI程序,需在Web服务器上运行."</p>
<p>End Sub</p>
<p></p>
<p>---- 现 在, 介 绍 在VB5.0 集 成 开 发 环 境 里 编 辑、 编 译、 调 试 该Windows CGI 应 用 程 序 并 生 成 可 执 行 文 件 放 入 服 务 器 中 在 网 上 使 用 的 具 体 步 骤:</p>
<p></p>
<p>---- 1 建 立 项 目(Project): 运 行VB5.0, 在 主 菜 单 选“ 文 件(F) | 新 建 工 程(N)”, 在 出 现 的“ 新 建 工 程” 对 话 框 中 选“ 标 准 EXE”; 由 于Windows CGI 应 用 程 序 不 需 要 自 己 的 窗 体, 故 在 用VB5.0 建 立 项 目 文 件(Project) 的 上 述 步 骤 后, 在 出 现 的 名 为“ 工 程- 工 程1” 的“ 资 源 管 理 器” 窗 口 中 用 鼠 标 右 击“Form1” 将 其 删 除;</p>
<p></p>
<p>---- 2 添 加 文 件: 在 主 菜 单 选“ 工 程(P) | 添 加 文 件(A)”, 在 出 现 的 添 加 文 件 对 话 框 中 选 择cgi32.bas 所 在 目 录( 例 如c:\website\lib\) 将 其 打 开 加 入 工 程 中;</p>
<p></p>
<p>---- 3 添 加 模 块: 在 主 菜 单 选“ 工 程(P) | 添 加 模 块(M)”, 在 出 现 的 对 话 框 中 将 模 块(Module1) 打 开 加 入;</p>
<p></p>
<p>---- 4 录 入 代 码: 在 模 块 代 码 窗 口 中 录 入 上 面 给 出 的 两 个 子 过 程 的 代 码。</p>
<p></p>
<p>---- 5 保 存 模 块 和 工 程 文 件: 在 主 菜 单 中 选:“ 文 件(F) | 工 程 另 存 为(E)”, 可 对 模 块(Module1.bas) 和 工 程( 工 程1.vbp) 重 新 取 名( 例 如:guida.bas 和guida.vbp) 存 盘;</p>
<p></p>
<p>---- 6 生 成 可 执 行 文 件: 在 主 菜 单 中 选“ 文 件(F) | 生 成 guida.exe(K)”, 在 出 现 的 对 话 框 里 选 好 存 盘 目 录 将guida.exe 存 盘;</p>
<p></p>
<p>---- 7 将 生 成 的 可 执 行 文 件(guida.exe) 放 入 服 务 器: 对WebSite 服 务 器, 应 放 置 在 子 目 录\WebSite\cgi-win\ 里;</p>
<p></p>
<p>---- 8 在Web 客 户 端 运 行 这 个CGI 程 序: 在 本 机 上 运 行, 打 开 浏 览 器, 在URL 栏 中 连 接: http://localhost/cgi-win/guida.exe ; 在 网 上 的Web 客 户 端, 用 http:// 服 务 器 主 机/cgi/guida.exe</p>
<p></p>
<p>三、 用VB5.0 制 作 一 个 网 上 征 求 意 见 的Windows CGI 应 用 程 序</p>
<p>---- 下 面 举 一 个 较 复 杂 实 用 的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 客 户 返 回 一 个 信 息 回 条 表 示 客 户 表 单 已 收 到。</p>
<p>---- 由 于 编 译 使 用 这 个CGI 程 序 的 做 法 与 上 面 完 全 相 同, 故 下 面 仅 给 源 程 序 代 码:</p>
<p></p>
<p>Option Explicit</p>
<p>Const BOOK_FILE = "guestbk.csv" 注释:存放客户</p>
<p>数据的文件,自动生成,可用Excel97调阅</p>
<p>Declare Sub Sleep Lib "kernel32"</p>
<p>(ByVal dwMilliseconds As Long)</p>
<p>Sub CGI_Main()</p>
<p>If CGI_RequestMethod = "POST" Then</p>
<p>EnterGuest</p>
<p>Beep</p>
<p>Else</p>
<p>ReturnForm</p>
<p>End If</p>
<p>End Sub注释:</p>
<p></p>
<p>---- 一 当Web 客 户 要 求CGI 连 接, 服 务 器 执 行ReturnForm(), 送 出 征 求 建 议 的 表 单:</p>
<p>Sub ReturnForm()</p>
<p>Send "Content-type: text/html"</p>
<p>Send ""</p>
<p>Send ("< HTML >< HEAD >< TITLE >贵州大学</p>
<p>< /TITLE >< /HEAD >")</p>
<p>Send ("< BODY >< H2 >欢迎您访问贵州</p>
<p>大学计算机软件与理论研究所WWW站点< /H1 >")</p>
<p>Send ("我们的e-mail是< A HREF=""mailto:"</p>
<p>& CGI_ServerAdmin & _</p>
<p>""" >lixiang@gzu.edu.cn:< /A >")</p>
<p>Send ("< HR >")</p>
<p>Send ("请填下表,留下您的宝贵建议:")</p>
<p>Send ("< FORM ACTION="""</p>
<p>& CGI_ExecutablePath & """ METHOD=""POST"" >")</p>
<p>Send ("< PRE > 您的姓名:</p>
<p>< INPUT SIZE=25 NAME=""name"" >")</p>
<p>Send (" E-mail地址:</p>
<p>< INPUT SIZE=25 NAME=""email"" >")</p>
<p>Send ("您给我们的建议:< TEXTAREA COLS=40</p>
<p>ROWS=4 WRAP=VIRTUAL NAME=""comments"" >")</p>
<p>Send ("< /TEXTAREA >< /PRE >")</p>
<p>Send ("请击此处将您的建议送我们:</p>
<p>< INPUT TYPE=""submit""")</p>
<p>Send ("VALUE=""发送您的建议"" >")</p>
<p>Send ("< HR >")</p>
<p>Send ("< /FORM >< /BODY >< /HTML >")</p>
<p>End Sub</p>
<p></p>
<p>注释:获取客户建议表单数据,将所填数据存入文件guestbk.csv并向客户返回一个信息</p>
<p>Sub EnterGuest()</p>
<p>Dim iLockTries As Integer</p>
<p>Dim sDate As String</p>
<p>Dim sName As String</p>
<p>Dim sEmail As String</p>
<p>Dim sComments As String</p>
<p>注释:Dim sBrowser As String</p>
<p>Dim sFirstName As String</p>
<p>Dim fn As Integer</p>
<p>注释:提取建议的有关数据:</p>
<p>sName = GetSmallField("name")</p>
<p>sEmail = GetSmallField("email")</p>
<p>sComments = GetSmallField("comments")</p>
<p>iLockTries = 0</p>
<p>fn = FreeFile</p>
<p>On Error GoTo gLockFail</p>
<p>gRetryLock:</p>
<p>Open App.Path + "\" + BOOK_FILE For</p>
<p>Append Lock Read Write As #fn</p>
<p>On Error GoTo 0</p>
<p>sDate = Now</p>
<p>Write #fn, sDate, sName, sEmail,</p>
<p>sComments, CGI_RemoteAddr</p>
<p>Close #fn</p>
<p>sFirstName = Trim$(Left$(sName,</p>
<p>InStr(sName, " ")))</p>
<p>If sFirstName < > ""</p>
<p>Then sFirstName = sFirstName & ", "</p>
<p>Send ("Content-type: text/html")</p>
<p>Send ("")</p>
<p>Send ("< HTML >< HEAD >< TITLE >谢谢您!</p>
<p>< /TITLE >< /HEAD >")</p>
<p>Send ("您的签名与建议是:< PRE >")</p>
<p>Send ("日期: " & sDate)</p>
<p>Send ("姓名: " & sName)</p>
<p>Send ("E-Mail: " & sEmail)</p>
<p>Send ("Host address:</p>
<p>[" & CGI_RemoteAddr & "]")</p>
<p>Send ("建议:< /PRE >")</p>
<p>Send (sComments)</p>
<p>Send ("< H2 >谢谢您!< /H2 >")</p>
<p>Send ("< /BODY >< /HTML >")</p>
<p>Exit Sub</p>
<p>gLockFail:</p>
<p>Sleep (1000)</p>
<p>iLockTries = iLockTries + 1</p>
<p>Resume gRetryLock</p>
<p>End Sub</p>
<p></p>
<p>Sub Inter_Main()</p>
<p>MsgBox "这是CGI程序,</p>
<p>需要在Web服务器中运行。", 16, "CGI.BAS"</p>
<p>End Sub </p>
<p> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -