[CGI]Request Method=POST //传递方式,即HTML中的Form method有GET,POST,HEAD等。Server Software=WebSite/1.1e//Server的名称与版本。Server Name=199.199.198.55//Server的IP地址。Server Port=80//Server的Socket Port。Server Admin=tomy@vico.bme.zju.edu.cn//Server管理者的E-mail地址。Referer=http://199.199.198.55///主页的URL路径。Remote Address=199.199.198.89//Client端的IP地址。[System]Output File=c:/WebSite/cgi-temp/198ws.out//输出文件的路径名。Content File=c:/WebSite/cgi-temp/198ws.inp//输入文件的路径名。[Form Literal]type=B//接收到的Form data即client端动作的结果信息。
原则上可用来编写CGI程序的语言有:perl, AppleScript, Unix Shell, VB, C/C++等。但在Windows(NT、3x、95)环境下,还是必须借助成熟的Windows编程语言才能编写出精巧的Win CGI程序。C语言是一门深受广大程序员喜爱的语言,尤其是VCi++作为一门面向对象的语言,具备了Windows环境的许多基本功能,如OLE,ODBC等。通过ODBC这项功能,可以非常容易地连接FoxPro, Access, dBASE等多种数据库,而无需考虑各种数据库结构的差异。 以下是笔者用VC++4.0编写的一个用Win CGI连接数据库的范例。使用者可在屏幕上选择,以查询ISP服务商提供的internet服务价格表。系统环境采用Windows 95,数据库采用FoxP ro2.5, WWW Server采用Website。1.建立数据库 本例的CGI程序是通过ODBC连接数据库,因此数据库建完后,应用32位ODBC驱动器加以登记。2.编写HTML程序 使用者可在屏幕上选择一服务类型,再按"提交"键,即可查询这一服务类型的各价格栏目。其HTML文本描述如下:<HTML><HEAD>{TITLE>维科公司internet服务收费标准</TITLE></HEAD><pre><H1>维科公司internet服务收费标准</H1></P><hr><form method="POST" action="cgi-win/wincgi.exe">您要查询的类型是:<UL><LI>A类用户<input name="usertype" type=radio value="A"><LI>B类用户<input name="usertype" type=radio value="B"><LI>C类用户<input name="usertype" type=radio value="C"><LI>D类用户<input name="usertype" type=radio value="D"> </UL><center><input type=submit value="提交"> <input type=reset value="取消"></center></pre></form><hr></HTML>3.编写VC++CGI程序 Website为C++程序员提供了一个CCGI类,可在/website目录下找到。该类提供了一些方便的函数,无需程序员编写一些直接与CGI界面打交道的底层工作,充分体现面向对象语言的优势。在VC++4.0中建立一个"Dialog based"工程框架。将CCGI类引入框架,即将cgi.h,cgi .cpp加入程序。然后用VC++的ClassWizard工具创建一个与数据库相对应的CUserSet类,该类继承MFC类库中的CRecordSet类。主要代码加在wincgi.cpp文件中。
//程序:wincgi.cpp#include "stdafx.h"#include "wincgi.h"#include "cgi.h"#include "userset.h"……void ProcessCGI(CCGI *cgi);BOOL CBaseApp::InitInstance(){CCGI cgi(m-ipCmdLine); //实例化CCGI类,并用命令行参数初始化if(cgi.CalledAsCGI()){try{ProcessCGI(&cgi);//在此做所有真正的工作}catch(CException* e){cgi.HandleException(e);//异常处理e->Delete();}}return FALSE;}void ProcessCGI(CCGI *cgi){int i;CString strTemp, strWebmaster, strReferer;strWebmaster=cgi->GetCGIVar("Server Admin");//获得Server管理者的E-mail地址。strReferer=cgi->GetCGIVar("Referer"); //获得主页的URL路径。CStringArray csaFields;cgi->EnumFormFieldNames(csaFields);//取得所有变量名,放在数组中。cgi->WriteHTMLHeader();cgi->WriteHTMLBody("<HEAD><TITLE>VC++CGI test</TITLE></HEAD>/015/012");cgi->WriteHTMLBody("<BODY>/015/012");CString csaFieldVal;csaFieldVal=cgi->GetFormField(csaFields[0]);//得到第一个变量的值,即"usertype"变量的值。cgi->WriteHTMLBody("<h1>internet服务收费标准查询结果</h1><hr>");CUserSet m-user;//实例化CUserSet类char sfilter[80];wsprintf(sfilter,"USER-TYPE='%s''',csaFieldVal);m-user.m-strFilter=sfilter;//设置筛选器。m-user.Open();strTemp="<h2>"+m-user.m-USER-TYPE+"类用户"+"</h2>/015/012";cgi->WriteHTMLBody(strTemp);strTemp="<P>入网费:"+m-user-FARE-INI+".</P>/015/012";cgi->WriteHTMLBody(strTemp);……strTemp="<P>通信费:"+m-user.m-FARE-COM+".</P>/015/012";cgi->WriteHTMLBody(strTemp);m-user.Close();if(!strReferer.IsEmpty())//设置回到主页的锚点。{cgi->WriteHTMLBody("<P>Go<A HREF=/"");cgi->WriteHTMLBody(strReferer);cgi->WriteHTMLBody("/">Back</A>where you came from.</P>/015/012");}if(!strWebmaster.IsEmpty())//设置Server管理者的E-mail地址。{cgi->WriteHTMLBody("<P>Please email comments to");cgi->WriteHTMLBody("<A HREF=/"mailto:");cgi->WriteHTMLBody(strWebmaster);cgi->WriteHTMLBody("/">");cgi->WriteHTMLBody(strWebmaster);cgi->WriteHTMLBody("</A>.</P>/015/012");}cgi->WriteHTMLBody("</BODY>/015/012");cgi->WriteHTMLFooter();}4.结论 将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用浏览器查询结果。至此简单地阐述了用VC++编写Win CGI程序的整个过程,C程序员也可以用自己熟悉的语言编写CGI程序了。利用VC++的强大功能,你的WWW Server将无所不能。