?? delphi開發web程序常見問題.txt
字號:
DELPHI開發Web程序常見問題
--------------------------------------------------------------------------------
作者:不詳 來源于:不詳 發布時間:2005-2-14 3:44:55
Web程序開發對開發工具提出了極大挑戰,面對用戶的眾多需求,許多公司推出一大堆開發平臺:開發桌面應用程序和C/S程序的,開發中間件的,開發Web服務器的。這造成程序員面對一大堆工具無從下手。
DELPHI和其他開發工具不同,因為它是一個開放系統,只要靈活使用一些控件,即可開發出各種類型的系統,不論N-Tie程序、多線程程序、分布計算程序(包括DCOM和CORBAR)、TCP程序、Web程序、ActiveX、中間件、推程序(Push),甚至你可以用它來寫匯編程序。
DELPHI將ISAPI/NSAPI/CGI/WCGI等巧妙地封裝成一個類,用戶只要在編譯時選擇編譯結果,就可以得到不同的系統。
在DELPHI 4中Inprise公司進一步加強了對Web程序開發的支持,可以開發出更好更強的系統。以下是開發Web應用程序中的幾個常見問題,可以供大家參考。如果沒有特別申明,則表示程序運行于DELPHI 4下。
如何從Web Server Application返回一幅圖像?
Web Server Application不僅可以生成復雜的頁面文檔,也可以根據用戶請求返回不同的圖像。當然有比較簡單的方法,根據輸入參數不同,〈img src...〉標記也指向不同的URL地址。這里我們不用這個辦法,而是利用DLL返回圖像。
當然要首先建立一個頁面容器(page producer),內容如下:
〈html〉
〈body〉This is a test〈BR〉〈img src=″/scripts/mydll.dll/picture″〉〈/body〉
〈/html〉
接下來我們設定對應于PathInfo的動作事件,返回圖像結果,源代碼如下:
(注意:單元聲明中要包含JPEG單元)
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
jpg align=left: TJpegImage; S: TMemoryStream;
begin
jpg align=left := TJpegImage.Create;
try
jpg align=left.LoadFromFile(′test′);
S := TMemoryStream.Create;
try
jpg align=left.SaveToStream(S);
S.Position := 0;
Response.ContentType := ′image/jpeg′;
Response.ContentStream := S;
// 必須在流釋放前完成
Response. SendResponse;
finally
S.Free;
end;
finally
jpg align=left.Free;
end;
end;
實際上用這種方法和前面提到的簡單做法相比,具有更安全和更靈活的特點。在某些地方靈活使用,以此為基礎稍加修改可以產生一般開發工具難以實現的效果。
如何在ISAPI/NSAPI動態連接庫(DLL)中使用本地數據庫驅動程序(native Access driver)?
這是因為DAO 3.0 或者DAO 3.5是所謂thread-safe(線程安全程序),而一個Web服務器(例如IIS)會隨用戶請求產生多個線程,同時把ISAPI對應的DLL也列為線程。這時ISAPI就會通過BDE通知DAO,告訴它不符合線程安全規定。
解決的方法有很多,如果你一定要訪問Access 95/97庫,那么可以通過ODBC訪問。ODBC不會經過DAO,而且也是一個線程安全程序。此外還有一些第三方的控件集,通過他們可以直接由BDE訪問Access 95/97,效率更高。
用戶訪問我Web服務器上的ISAPI DLL,可是報告:“Invalid filename"(無效的文件名),然而文件的確存在的。對了,我的數據庫在一臺Novell 服務器上。這是為什么呢?
你沒有設定對應于你IUSR_XXX賬戶的驅動器路徑映射(MAPING)。因為Novell不是采用FAT,所以要手工添加路徑映射。當然,可以做成開機登錄腳本。請牢記,如果你運行IIS作為Web服務器,而又涉及Novell,無論作為文件服務器或數據庫服務器,都要定義好路徑映射。
“Invalid configuration parameter for alias {alias_name}"(無效的別名配置),當我設置一個ODBC DSN,并通過它訪問ISAPI/NSAPI服務器時就出現這樣一個錯誤。
你如果要為訪問的用戶(IIS用戶)建立一個ODBC別名,那么要注意創建一個SYSTEM DSN(系統DNS),而不要創建“用戶DNS”,雖然“用戶DNS”是缺省設定。
如何取得客戶機(訪問機器)的名稱和IP地址?
實現這個功能用TCP控件來做非常容易。從Internet頁面上選取一個TCP控件,然后直接就可以得到你所需要的:
Memo1.Lines.Add(TCP1.LocalHostName);
Memo1.Lines.Add(TCP1.LocalIp);
當然,如果你不希望這樣做,還有比較復雜的辦法:
uses Winsock;
procedure TForm1.FormCreate(Sender: TObject);
var
wVersionRequested : WORD;
wsaData : TWSAData;
begin
{創建 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
end;
procedure TForm1.Button1Click(Sender: TObject);
var p : PHostEnt; s : array[0..128] of char; p2 : pchar;
begin
{得到計算機名稱}
GetHostName(@s,128);
p:=GetHostByName(@s);
Memo1.Lines.Add(p^.h_Name);
{得到機器IP地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
Memo1.Lines.Add(p2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{釋放 WinSock}
WSACleanup;
end;
這是一個調用了WINSOCK的獨立單元,你可以把它直接嵌入到你的程序中去。
在DELPHI 3中為何不能創建真正的多線程DLL?
雖然DELPHI 3中的ISAPI DLL向導已經為創建多線程DLL生成了大量代碼,可是還是有一個嚴重的缺陷:沒有申明本應用程序是一個多線程的程序。所以需要你添加一句話:
IsMultiThread := TRUE;
把這句話放在DPR程序begin-end塊的開始處,使之成為第一句。
如何得知現在是否和Internet連接?
最簡單的辦法是用一個TCP元件得到自己當前的IP,通過判斷IP得知是否連入Internet。例如:
if TCP1.LocalIp = '0.0.0.0' then
ShowMessage('目前沒有連入Internet!');
需要注意的是:因為Internet和Intranet沒本質區別,所以一般不能判定是和Internet連接還是僅僅連入Intranet。當然。你也可以再加一個PING元件,去PING一個比較穩定、速度比較快的站點,如果連通則表明已經接入Internet。不過這種辦法通用性不好。
如何打印一個Web頁面?
可以選用HTML控件的AutoPrint方法。例如:
uses Printers;
procedure TForm1.Button1Click(Sender: TObject);
var
OldCur: TCursor;
begin
OldCur := Screen.Cursor;
with Printer do begin
BeginDoc;
HTML1.AutoPrint(handle);
Title := HTML1.URL;
EndDoc;
end;
Screen.Cursor := OldCur;
end;
此外還可以利用其PrintPage方法。不過我推薦你采用AutoPrint,因為這樣控制更靈活,可以過濾一些你不希望打印的內容。
結 語
最后我還要向你推薦幾套DELPHI編寫Web程序的增強控件集,它們是:
1)CGI Expert 4 由Lars German公司出品,編寫 shell-CGI、 win-CGI、 ISAPI和NSAPI程序特別方便。
2)NetMaster的Internet控件集。DELPHI 4中的Internet控件集就是它們的杰作,和DELPHI結合得非常好。你可以去下載它們的最新版,功能更強大,而且對DELPHI用戶是免費的。
3)Dart Communications出品的PowerTCP的確非常強大,如果編寫專業級TCP應用程序必不可少。有很多功能實際是由DLL提供的。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -