用VC++編寫CGI程式 (轉)

worldblog發表於2007-12-04
用VC++編寫CGI程式 (轉)[@more@]

用VC++編寫CGI

浙江大學生命科學與醫學工程學系 徐晨勇 段會龍 呂維雪
  摘 要  該文透過對CGI程式,特別是 CGI程式原理的分析,介紹了用Visual C+ +語言編寫CGI程式的方法,並給出了一個用CGI程式使得WWW與相連的例子。


關鍵詞 WWW HTML VC++ 資料庫


  近年來,Inte與Intranet迅猛發展,企業紛紛建立自己的Intranet,以加強企業內部的聯絡,促進與外部世界的溝通,增強企業的競爭能力。透過建立自己的Internet伺服器,企業能在上釋出廣告,介紹本公司的情況與產品,收集顧客意見,以及建立虛擬電子商場等。大家都知道寫一個HTML超文字放在World W 伺服器上,即可透過各種訪問你的主頁,但是如何使你的靜態主頁能響應客戶的動作,並與本地的資料庫聯絡,將資料庫的相應內容傳送給遠端的瀏覽器呢?這就需要透過CGI介面進行聯絡。
  CGI全名是Common Gateway Interface,它是WWW伺服器外部程式的介面透過CGI,WW W伺服器能完成一些本身所力不能及的工作。

  在不同下CGI介面也不相同,可分為Standard CGI介面、DCGI介面與Win CG I介面等。Standard CGI介面用於系統,它是透過環境變數來實現WWW Server與CGI應用程式之間的聯絡。DOS CGI介面與Standard CGI介面原理類同。Win CGI介面則與前兩者大不相同。由於越來越多的WWW Server採用Windows系統,而Windows系統又不能有效地傳遞環境變數,由Bob Denny提出了一種Windows CGI標準,並得以不斷推廣。
Win CGI是透過.ini檔案來進行聯絡的。在Windows環境下,許多應用程式都是利用.ini 檔案,即profile檔案來定義一些基本設定,而Win CGI程式與WWW Server之間也正是透過pro file檔案來實現聯絡的。當WWW Client透過WWW Server觸發CGI程式時,WWW Server先動態生成幾個檔案於臨時目錄下,分為.ini、.inp、.out等檔案。在WWW Server生成CGI程式的程式時,透過命令列引數將.ini檔案的絕對路徑傳給CGI程式。.ini檔案中也包含了.inp、.ou t等檔案路徑資訊。這樣,CGI程式可讀取.ini和.inp檔案所提供的資訊,瞭解所有來自WWW Server端和與WWW Client端的資料。然後,CGI程式可以呼叫外部程式,或由CGI直接外部程式的功能,並將要傳給客戶端的資訊以HTML文字的形式寫在.out檔案上。最後,WWW Server取.out檔案的HTML文字,將資訊傳送給WWW Client端,並刪除臨時目錄下的檔案。那麼,CGI的profile檔案包含了什麼資料呢?與Windows其它.ini檔案一樣,CGI profile 檔案包含了許多session,每個session又包含一些key,以下是一個CGI profile的部份內容


[CGI]
Request Method=POST //傳遞方式,即HTML中的Fomethod有GET,POST,HEAD等。
Server Software=WebSite/1.1e
//Server的名稱與版本。
Server Name=199.199.198.55
//Server的。
Server Port=80//Server的Socket Port。
Server Admin=tomy@vico.bme.zju.edu.cn//Server管理者的E-地址。
Referer=
//主頁的URL路徑。
Remote Address=199.199.198.89
//Client端的IP地址。
[System]
Output File=c:WebSitecgi-temp198ws.out//輸出檔案的路徑名。
Content File=c:WebSitecgi-temp198ws.inp//輸入檔案的路徑名。
[Form Literal]
type=B//接收到的Form data即client端動作的結果資訊。


  原則上可用來編寫CGI程式的語言有:, AppleScript, Unix , VB, C/C++等。但在Windows(NT、3x、95)環境下,還是必須藉助成熟的Windows語言才能編寫出精巧的Win CGI程式。C語言是一門深受廣大程式設計師喜愛的語言,尤其是VCi++作為一門面向的語言,具備了Windows環境的許多基本功能,如OLE,OC等。透過ODBC這項功能,可以非常容易地連線FoxPro, Access, SE等多種資料庫,而無需考慮各種資料庫結構的差異。
  以下是筆者用VC++4.0編寫的一個用Win CGI連線資料庫的範例。使用者可在螢幕上選擇,以查詢ISP服務商提供的internet服務價格表。系統環境採用Windows 95,資料庫採用Foro2.5, WWW Server採用Website。

1.建立資料庫
  本例的CGI程式是透過ODBC連線資料庫,因此資料庫建完後,應用32位ODBC器加以登記。

2.編寫HTML程式
  使用者可在螢幕上選擇一服務型別,再按"提交"鍵,即可查詢這一服務型別的各價格欄目。其HTML文字描述如下:

{TITLE>維科公司internet服務收費標準

維科公司internet服務收費標準





您要查詢的型別是:
  • A類
  • B類使用者
  • C類使用者
  • D類使用者







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管理者的地址。
strReferer=cgi->GetCGIVar("Referer"); //獲得主頁的URL路徑。
CStringArray csaFields;
cgi->EnumFormFieldNames(csaFields);
//取得所有變數名,放在陣列中。
cgi->WriteHTMLHeader();
cgi->WriteHTMLBody("

VC++CGI test1512");
cgi->WriteHTMLBody("1512");
CString csaFieldVal;
csaFieldVal=cgi->GetFormField(csaFields[0]);
//得到第一個變數的值,即"usertype"變數的值。
cgi->WriteHTMLBody("

internet服務收費標準查詢結果


");
CUserSet m-user;
//例項化CUserSet類
char ilter[80];
wsprintf(sfilter,"USER-TYPE='%s''',csaFieldVal);
m-user.m-strFilter=sfilter;
//設定篩選器。
m-user.Open();
strTemp="

"+m-user.m-USER-TYPE+"類使用者"+"

1512";
cgi->WriteHTMLBody(strTemp);
strTemp="

入網費:"+m-user-FARE-INI+".

1512";
cgi->WriteHTMLBody(strTemp);
……
strTemp="

通訊費:"+m-user.m-FARE-COM+".

1512"
;
cgi->WriteHTMLBody(strTemp);
m-user.Close();
if(!strReferer.IsEmpty())
//設定回到主頁的錨點。
{
cgi->WriteHTMLBody("

Gocgi->WriteHTMLBody(strReferer);
cgi->WriteHTMLBody("">Back
where you came from.

1512");
}
if(!strWebmaster.IsEmpty())
//設定Server管理者的E-mail地址。
{
cgi->WriteHTMLBody("

Please comments to");
cgi->WriteHTMLBody("cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("">");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("
.

1512");
}
cgi->WriteHTMLBody("1512");
cgi->WriteHTMLFooter();
}

4.結論
  將程式編譯後,把wincgi.exe拷入website/cgi-win/目錄下,用瀏覽器查詢結果。至此簡單地闡述了用VC++編寫Win CGI程式的整個過程,C程式設計師也可以用自己熟悉的語言編寫CGI程式了。利用VC++的強大功能,你的WWW Server將無所不能。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987967/,如需轉載,請註明出處,否則將追究法律責任。

相關文章