home *** CD-ROM | disk | FTP | other *** search
Wrap
<HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2"> <META NAME="Author" CONTENT="Tomas Rosa"> <META NAME="GENERATOR" CONTENT="Mozilla/4.02 [en] (Win95; I) [Netscape]"> <TITLE>Jak na ISAPI skripty v Delphi</TITLE> <!--#include virtual="/main_header.inc"--> <div style="font-family:Tahoma,Helvetica,Arial; font-size:10pt;"> <H3> Jak na ISAPI skripty v Delphi?</H3> PinkNet Web Server je vybaven zßkladnφ podporou ISAPI skript∙, kterß mu umo╛≥uje spolupracovat s aplikacemi, kterΘ byli vyvinuty pro Win32 platformu v rozhranφ M$ Internet Server API - ISAPI. <BR> Psanφ skript∙ je pom∞rn∞ jednoduchΘ, pokud mßte alespo≥ p°edstavu jak se volajφ. Jß osobn∞ pou╛φvßm Delphi a proto nßsledujφcφ ukßzka bude prßv∞ pro n∞j. <BR> Zde je v²pis jedoduchΘho skriptu (dostupn² na adrese <A HREF="http://localhost/demo/cgi-bin/isapi_minimal.dll">http://localhost/demo/cgi-bin/isapi_minimal.dll</A> ve standartnφ instalaci PNWS): <PRE><B>library</B> ISAPI_Minimal; <B>uses </B> SysUtils, Classes, isapi2 in '\Program Files\Borland\Delphi\Source\RTL\WIN\isapi2.pas'; <I><FONT COLOR="#000099">// Zalezi na velikosti pismen v nazvu !!!! </FONT></I><B>function </B>GetExtensionVersion(<B>var </B>ver: THSE_VERSION_INFO): Boolean; <B>stdcall</B>; <B>begin </B> result:=True; <I><FONT COLOR="#000099">// Rekni, ze je vse OK -> sice nic nevracime, ale to nevadi</FONT></I> <B>end; </B><I><FONT COLOR="#000099">// Zalezi na velikosti pismen v nazvu !!!! </FONT></I><B>function </B>HttpExtensionProc(<B>var </B>ecb: TEXTENSION_CONTROL_BLOCK): LongInt; <B>stdcall</B>; <B>var </B> FN_Write: TWriteClientProc; s: <B>String</B>; len: Integer; <B>begin </B> <I><FONT COLOR="#000099">// Vytvor si funkci pro zapis dat </FONT></I> @FN_Write:=@ecb.WriteClient; <I><FONT COLOR="#000099">// Vytvor si do stringu S odpoved ve formatu HTML </FONT></I> s:= 'HTTP/1.0 200 OK'#13#10#13#10; s:=s+'<html><head>'#13#10; s:=s+' <title>ISAPI skript</title>'#13#10; s:=s+'</head><body bgcolor=white>'#13#10; s:=s+'<h1>Generovanß strßnka</h1>'#13#10; s:=s+'Tento text je generovan² knihovnou ISAPI v serveru PNWS'#13#10; s:=s+'</body></html>'; len:=Length(s); <I><FONT COLOR="#000099">// Zapis do prohlizece </FONT></I> FN_WRITE(ecb.ConnID, PChar(s), len, 0) <I><FONT COLOR="#000099">// No a to je asi vse... ...je jasne, ze skript nebude omezen jen na // jednoduche splacani neceho do stringu S, ale bude neco konat </FONT></I><B>end</B>; <I><FONT COLOR="#000099">// Potreba pro export funkci </FONT></I><B>exports </B> GetExtensionVersion, HttpExtensionProc; <B>begin end</B>.</PRE> Je jasnΘ, ╛e v∞t╣ina skript∙ pot°ebuje VSTUPN═ data a proto si ukß╛eme i jak si je od serveru zφstkat. Pro zφskßnφ dat pomocφ metody po╛adavky GET (tedy skript.dll?data) pou╛ijeme zßznam typu PChar dostupn² p°es jmΘno <B><TT>ecb.lpszQueryString</TT></B>. Data p°es metodu POST jsou ulo╛ena v bloku na kter² ukazuje pointer <B><TT>ecb.lpbData</TT></B>. Jejich velikost je urΦena prom∞nou <B><TT>ecb.cbTotalBytes</TT></B>. <BR> Pro zφskßnφ prom∞nΘ od serveru (nap°φklad jmΘno serveru, Φi typ prohlφ╛eΦe) m∙╛eme do procedury <B><TT>HttpExtensionProc </TT></B>p°idat nßsledujφcφ vno°enou proceduru: <PRE><I><FONT COLOR="#000099">// Fuknce vracφ promenou prostredi od serveru </FONT></I><B>function</B> GetServerVar(name:string):<B>string</B>; <B>var</B> FN_GetVariable:TGetServerVariableProc; pch:PChar; len:integer; <B>begin </B> <I><FONT COLOR="#000099">// Prirazeni procedury </FONT></I> @FN_GetVariable:=@ecb.GetServerVariable; <I><FONT COLOR="#000099">// maximalni velikost prichozich dat </FONT></I> len:=1024; pch:=StrAlloc(len); <I><FONT COLOR="#000099">// Zeptej se na data </FONT></I> <B>if</B> FN_GetVariable(ecb.ConnID,PChar(name),pch,len) <B>then </B> result:=pch <B>else </B> result:='*nedefinovano*'; <B>end</B>;</PRE> </div> <!--#include virtual="/main_footer.inc"-->