用VC++編寫CGI程式 (轉)
用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文字描述如下:
維科公司internet服務收費標準
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("
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("">Backwhere you came from.
}
if(!strWebmaster.IsEmpty())
//設定Server管理者的E-mail地址。
{
cgi->WriteHTMLBody("
Please comments to");
cgi->WriteHTMLBody("cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("">");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody(".
}
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用VB編寫標準CGI程式 (轉)
- 用Delphi編寫DelTree程式 (轉)
- 用VB編寫抽獎程式 (轉)
- 用Delphi編寫安裝程式(1) (轉)
- 用 C++Builder 編寫 Tray 程式 (轉)C++UI
- 用VC++6.0編寫撥號程式 (轉)C++
- 為Linux 應用程式編寫 DLL(轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- 編寫Linux實用程式的藝術(轉)Linux
- 用BCB編寫身份證號識別程式 (轉)
- 用Delphi編寫塗鴉桌面的小程式 (轉)
- 本地除錯PERL CGI程式(轉)除錯
- 用Java編寫ASP元件 (轉)Java元件
- 用Excel編寫小遊戲 (轉)Excel遊戲
- 用C#Builder編寫螢幕保護程式 (轉)UI
- 用C語言技術進行CGI程式設計(轉)C語言程式設計
- C++ web程式設計:寫出你的CGI程式C++Web程式設計
- 用匯編編寫DOS下的記憶體駐留程式(5) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(3) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(4) (轉)記憶體
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 用VC6編寫登錄檔管理程式(三) (轉)
- 用VC6編寫登錄檔管理程式(二) (轉)
- 用Visual C++編寫電子郵件程式 (轉)C++
- 編寫高效的MySQL應用(轉)MySql
- 用PHP編寫Android應用程式PHPAndroid
- 編寫易讀的程式碼 (轉)
- 動畫程式編寫——DirectDraw之旅(3)(轉)動畫
- VC在windows下編寫用於序列通訊的程式 (轉)Windows
- 用VB編寫非同步多執行緒下載程式 (轉)非同步執行緒
- 編寫適用於模擬器的 Linux 程式碼(轉)Linux
- 用VC++ 6.0製作網路自動測試程式 (轉)C++
- apache web 中的CGI應用問題(轉)ApacheWeb
- 用PHP編寫email群發器 (轉)PHPAI
- (轉載)編寫高效的jQuery程式碼jQuery
- 自己編寫安裝製作程式 (轉)