?? 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 + -