一、WindowsCGI
----通用網關接口CGI是服務器與應用程序之間的接口,在編寫HTML文件時可結合其他程序語言使客戶通過浏覽器將數據輸入到文件裡,經服務器處理後轉送給客戶或記錄在服務器的數據庫中。任何一種程序設計語言寫的程序,若可在服務器主機上運行並可用CGI接口來傳遞數據,就可作為CGI應用程序,這種語言可被稱為CGI程序語言或腳本語言(scriptinglanguage);目前最受歡迎的CGI程序語言有:C/C ,shellScript,Perl,和VisualBasic,此外還有Fortran,TCL,AppleScript等。
----CGI接口因平台不同而不同。Windows平台的CGI稱為WindowsCGI。美國的BobDenny從需要實現CGI接口來處理Windows應用方面的要求入手設計實現了WindowsCGI,開發出目前在Windows95和WindowsNT平台上很受歡迎的HTTP服務器:WebSite;BobDenny用VB4.0寫的WindowsCGI接口程序名為CGI32.BAS,是一個給用戶在Windows95或WindowsNT環境下用VisualBasic來開發WindowsCGI應用程序的接口,主要處理WWW服務器(如:WebSite,Netscape,Alibaba等)與CGI程序之間的數據交換:在VB中通過WindowsCGI接口處理HTML的表單傳過來的變量,並把處理結果通過WindowsHTTPServer再傳給客戶機上的浏覽器,從而達到信息交互目的。
----由於Windows沒有命令解釋器(commandinterpreter),所以WindowsCGI程序都必需編譯為可執行文件在服務器上運行。
----除VB外,可以在Windows上用來寫WindowsCGI程序的語言還很多,例如:Delphi,Perl,VC 等;目前VisualBasic得以流行,是因為該語言不僅在Windows用戶中很普及,而且最早被發表為撰寫WindowsCGI程序的標准,同時該語言支持許多Windows環境:例如OLE,DDE,Sockets,ODBC等;此外,VB應用程序可在不需要窗體(windowsforms)而只在模組(modules)的環境下開發,十分符合CGI應用程序的需要。
----以前,多用VB4.0(32位版)開發WindowsCGI應用程序,由於VB5.0的推出,用VB5.0寫WindowsCGI應用程序更為簡單、方便和有力。
----要在Windows95/NT的PC微機上運行WindowsCGI程序必須在PC機上安裝一個支持WindowsCGI的服務器,例如WebSite;WebSite是一個基於Windows95/WindowsNT運行的32位、多線程的服務器,功能強大、使用方便,完全滿足小單位或個人建立PC服務器的要求。有關它的最新信息和免費試用版可從http://website.ora.com/獲取。
二、用VB5.0編制WindowsCGI應用程序的具體步驟
----Denny用VisualBasic4.0(32位版)開發了一個WindowsCGI庫模塊:CGI32.BAS,它與WebSite軟件一道提供使用(安裝WebSite時CGI32.BAS被放在c:websitelib下,很容易找到);CGI32.BAS為Windows95/WindowsNT下用VB4.0開發WindowsCGI程序設計提供了極大的方便;目前微軟推出了功能更強大的VisualBasic5.0,本文通過例子介紹在CGI32.BAS下用VB5.0編寫WindowsCGI應用程序的方法,通過這些例子可以看出用VB5.0來編寫WindowsCGI應用程序比VB4.0更為有力和簡單。
----下面首先介紹一個最簡單的WindowsCGI程序以及將它編譯為可執行文件放於服務器應用的方法,這些方法是一般的,對VB編寫的WindowsCGI程序普遍實用。程序由兩個子過程CGI_Main()和Inter_Main()構成,子過程CGI_Main()功能是在服務器端產生一個HTML頁面並送回Web客戶,這個頁面顯示了兩行漢字和服務器時間,是WindowsCGI程序的入口,是必不可少的;另一個子過程Inter_Main()提示該程序必須在Web服務器中運行。源程序代碼如下:
SubCGI_Main()
Send("Content-type:text/html")
Send("")
Send("<HTML><HEAD><TITLE>
歡迎</TITLE></HEAD>")
Send("<BODY>")
Send("<H1ALIGN=CENTER>
<FONTCOLOR='#FF0080'>
歡迎您訪問</FONT></H1>")
Send("<H1ALIGN=CENTER>
<FONTCOLOR='#FF0080'>
貴州大學計算機軟件與理論研究所
</FONT></H1>")
Send("<HRWIDTH='100'>")
Send("<P><H2><FONTCOLOR='#000000'>
您訪問的時間是:"&Now)
Send("我們的WWW網址:
<AHREF='http://www.gzu.edu.cn/
~lixiang/index.html'>
www.gzu.edu.cn/~lixiang/index.html</A>")
Send("我們的Email地址:
<AHREF='mailto:
[email protected]'>
[email protected]")
Send("</H2></BODY></HTML>")
EndSub
SubInter_Main()
MsgBox"這是CGI程序,需在Web服務器上運行."
EndSub
----現在,介紹在VB5.0集成開發環境裡編輯、編譯、調試該WindowsCGI應用程序並生成可執行文件放入服務器中在網上使用的具體步驟:
----1建立項目(Project):運行VB5.0,在主菜單選“文件(F)|新建工程(N)”,在出現的“新建工程”對話框中選“標准EXE”;由於WindowsCGI應用程序不需要自己的窗體,故在用VB5.0建立項目文件(Project)的上述步驟後,在出現的名為“工程-工程1”的“資源管理器”窗口中用鼠標右擊“Form1”將其刪除;
----2添加文件:在主菜單選“工程(P)|添加文件(A)”,在出現的添加文件對話框中選擇cgi32.bas所在目錄(例如c:websitelib)將其打開加入工程中;
----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服務器,應放置在子目錄WebSitecgi-win裡;
----8在Web客戶端運行這個CGI程序:在本機上運行,打開浏覽器,在URL欄中連接:http://localhost/cgi-win/guida.exe;在網上的Web客戶端,用http://服務器主機/cgi/guida.exe
三、用VB5.0制作一個網上征求意見的WindowsCGI應用程序
----下面舉一個較復雜實用的WindowsCGI程序,它由4個子過程組成:CGI_Main(),EnterGuest(),ReturnForm()和Inter_Main();它的功能是:服務器向申請連接的Web客戶發出一張表單,Web客戶在表單裡填入有關數據後送回服務器,服務器收到Web客戶的數據並將它們寫入一個文件中存儲起來,同時向Web客戶發送一個收條。這個WindowsCGI應用程序的工作流程如下:一當Web客戶要求CGI連接,服務器運行該CGI程序,首先執行CGI_Main()過程,CGI_Main()過程調用ReturnForm()向Web客戶送出一個表單,如果Web客戶填了意見表,並按鍵寄回服務器(此時過程CGI_Main()中CGI_RequestMethod="POST"成立)則由CGI_Main()過程調用EnterGuest()獲取客戶發來的數據並將其放入文件guestbk.csv中,同時向Web客戶返回一個信息回條表示客戶表單已收到。
----由於編譯使用這個CGI程序的做法與上面完全相同,故下面僅給源程序代碼:
OptionExplicit
ConstBOOK_FILE="guestbk.csv"'存放客戶
數據的文件,自動生成,可用Excel97調閱
DeclareSubSleepLib"kernel32"
(ByValdwMillisecondsAsLong)
SubCGI_Main()
IfCGI_RequestMethod="POST"Then
EnterGuest
Beep
Else
ReturnForm
EndIf
EndSub'
----一當Web客戶要求CGI連接,服務器執行ReturnForm(),送出征求建議的表單:
SubReturnForm()
Send"Content-type:text/html"
Send""
Send("<HTML><HEAD><TITLE>貴州大學
</TITLE></HEAD>")
Send("<BODY><H2>歡迎您訪問貴州
大學計算機軟件與理論研究所WWW站點</H1>")
Send("我們的e-mail是<AHREF=""mailto:"
&CGI_ServerAdmin&_
""">
[email protected]:</A>")
Send("<HR>")
Send("請填下表,留下您的寶貴建議:")
Send("<FORMACTION="""
&CGI_ExecutablePath&"""METHOD=""POST"">")
Send("<PRE>您的姓名:
<INPUTSIZE=25NAME=""name"">")
Send("E-mail地址:
<INPUTSIZE=25NAME=""email"">")
Send("您給我們的建議:<TEXTAREACOLS=40
ROWS=4WRAP=VIRTUALNAME=""comments"">")
Send("</TEXTAREA></PRE>")
Send("請擊此處將您的建議送我們:
<INPUTTYPE=""submit""")
Send("VALUE=""發送您的建議"">")
Send("<HR>")
Send("</FORM></BODY></HTML>")
EndSub
'獲取客戶建議表單數據,將所填數據存入文件guestbk.csv並向客戶返回一個信息
SubEnterGuest()
DimiLockTriesAsInteger
DimsDateAsString
DimsNameAsString
DimsEmailAsString
DimsCommentsAsString
'DimsBrowserAsString
DimsFirstNameAsString
DimfnAsInteger
'提取建議的有關數據:
sName=GetSmallField("name")
sEmail=GetSmallField("email")
sComments=GetSmallField("comments")
iLockTries=0
fn=FreeFile
OnErrorGoTogLockFail
gRetryLock:
OpenApp.Path "" BOOK_FILEFor
AppendLockReadWriteAs#fn
OnErrorGoTo0
sDate=Now
Write#fn,sDate,sName,sEmail,
sComments,CGI_RemoteAddr
Close#fn
sFirstName=Trim$(Left$(sName,
InStr(sName,"")))
IfsFirstName<>""
ThensFirstName=sFirstName&","
Send("Content-type:text/html")
Send("")
Send("<HTML><HEAD><TITLE>謝謝您!
</TITLE></HEAD>")
Send("您的簽名與建議是:<PRE>")
Send("日期:"&sDate)
Send("姓名:"&sName)
Send("E-Mail:"&sEmail)
Send("Hostaddress:
["&CGI_RemoteAddr&"]")
Send("建議:</PRE>")
Send(sComments)
Send("<H2>謝謝您!</H2>")
Send("</BODY></HTML>")
ExitSub
gLockFail:
Sleep(1000)
iLockTries=iLockTries 1
ResumegRetryLock
EndSub
SubInter_Main()
MsgBox"這是CGI程序,
需要在Web服務器中運行。",16,"CGI.BAS"
EndSub->