VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用VB编写Windows CGI应用程序
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:9315, 日期:2001-06-29
用VB编写Windows CGI应用程序
一、 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 客 户 返 回 一 个 信 息 回 条 表 示 客 户 表 单 已 收 到。
---- 由 于 编 译 使 用 这 个CGI 程 序 的 做 法 与 上 面 完 全 相 同, 故 下 面 仅 给 源 程 序 代 码:

Option Explicit
Const BOOK_FILE = "guestbk.csv" 注释:存放客户
数据的文件,自动生成,可用Excel97调阅
Declare Sub Sleep Lib "kernel32"
(ByVal dwMilliseconds As Long)
Sub CGI_Main()
If CGI_RequestMethod = "POST" Then
EnterGuest
Beep
Else
ReturnForm
End If
End Sub注释:

---- 一 当Web 客 户 要 求CGI 连 接, 服 务 器 执 行ReturnForm(), 送 出 征 求 建 议 的 表 单:
Sub ReturnForm()
Send "Content-type: text/html"
Send ""
Send ("< HTML >< HEAD >< TITLE >贵州大学
< /TITLE >< /HEAD >")
Send ("< BODY >< H2 >欢迎您访问贵州
大学计算机软件与理论研究所WWW站点< /H1 >")
Send ("我们的e-mail是< A HREF=""mailto:"
& CGI_ServerAdmin & _
""" >lixiang@gzu.edu.cn:< /A >")
Send ("< HR >")
Send ("请填下表,留下您的宝贵建议:")
Send ("< FORM ACTION="""
& CGI_ExecutablePath & """ METHOD=""POST"" >")
Send ("< PRE > 您的姓名:
< INPUT SIZE=25 NAME=""name"" >")
Send (" E-mail地址:
< INPUT SIZE=25 NAME=""email"" >")
Send ("您给我们的建议:< TEXTAREA COLS=40
ROWS=4 WRAP=VIRTUAL NAME=""comments"" >")
Send ("< /TEXTAREA >< /PRE >")
Send ("请击此处将您的建议送我们:
< INPUT TYPE=""submit""")
Send ("VALUE=""发送您的建议"" >")
Send ("< HR >")
Send ("< /FORM >< /BODY >< /HTML >")
End Sub

注释:获取客户建议表单数据,将所填数据存入文件guestbk.csv并向客户返回一个信息
Sub EnterGuest()
Dim iLockTries As Integer
Dim sDate As String
Dim sName As String
Dim sEmail As String
Dim sComments As String
注释:Dim sBrowser As String
Dim sFirstName As String
Dim fn As Integer
注释:提取建议的有关数据:
sName = GetSmallField("name")
sEmail = GetSmallField("email")
sComments = GetSmallField("comments")
iLockTries = 0
fn = FreeFile
On Error GoTo gLockFail
gRetryLock:
Open App.Path + "\" + BOOK_FILE For
Append Lock Read Write As #fn
On Error GoTo 0
sDate = Now
Write #fn, sDate, sName, sEmail,
sComments, CGI_RemoteAddr
Close #fn
sFirstName = Trim$(Left$(sName,
InStr(sName, " ")))
If sFirstName < > ""
Then sFirstName = sFirstName & ", "
Send ("Content-type: text/html")
Send ("")
Send ("< HTML >< HEAD >< TITLE >谢谢您!
< /TITLE >< /HEAD >")
Send ("您的签名与建议是:< PRE >")
Send ("日期: " & sDate)
Send ("姓名: " & sName)
Send ("E-Mail: " & sEmail)
Send ("Host address:
[" & CGI_RemoteAddr & "]")
Send ("建议:< /PRE >")
Send (sComments)
Send ("< H2 >谢谢您!< /H2 >")
Send ("< /BODY >< /HTML >")
Exit Sub
gLockFail:
Sleep (1000)
iLockTries = iLockTries + 1
Resume gRetryLock
End Sub

Sub Inter_Main()
MsgBox "这是CGI程序,
需要在Web服务器中运行。", 16, "CGI.BAS"
End Sub