一、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:\website\lib下,很容易找到);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:lixiang@gzu.edu.cn>
lixiang@gzu.edu.cn”)
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:\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制作一个网上征求意见的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&_
“””>lixiang@gzu.edu.cn:</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->