Die Projektdatei IsapiTest.DPR enthält nur ein Gerippe mit beiden Eintrittspunkten der DLL. Die eigentliche Funktionalität zur Antworterzeugung wurde in eine Unit TestMain.PAS ausgelagert. So halten Sie das Projekt übersichtlicher. Innerhalb der Hauptroutine HttpExtensionProc vermittelt der Aufruf von IsapiAction() den Zugriff die Erzeugung des Antworttextes in der Projektunit TestMain.PAS.
Im ISAPI-Testprogramm wird auf Hilfsroutinen aus meiner Unit IsapiHlp zurückgegriffen. Deshalb muß am Beginn der DLL-Funktion HttpExtensionProc die Adresse des Steuerblockes ECB an diese Unit übergeben werden. Da jeder Aufruf von HttpExtensionProc als neuer Thread abläuft, braucht auch jede Anforderung von Funktionen aus IsapiHlp die zugeordnete aktuelle ECB-Adresse.
function HttpExtensionProc(var ECB:TEXTENSION_CONTROL_BLOCK):DWORD;stdcall; var ResStr: string; StrLen: DWORD; begin IsapiHlp.pECB:=@ECB; ECB.lpszLogData:='DelphiTestDLL'; ResStr:=''; IsapiAction(ResStr); { hier eigentliche Aktion der Extension } ResStr:=Format( 'HTTP/1.0 200 OK'#13#10'Content-Type: text/html'#13#10+ 'Content-Length: %d'#13#10'Content:'#13#10#13#10'%s', [Length(ResStr), ResStr]); StrLen:=Length(ResStr); ECB.WriteClient(ECB.ConnID,Pointer(ResStr),StrLen,0); ECB.dwHTTPStatusCode:=200; HttpExtensionProc:=HSE_STATUS_SUCCESS; end; |
In der aus Übersichtsgründen ausgelagerten Projektunit TestMain wird der Ergebnisstring ResStr mit den Ausgabedaten versehen. Das erfolgt dort in der Procedur IsapiAction, die ihrerseits als lokalen Variablenparameter für das Ergebnis einfach nur s verwendet.
Dabei können Sie wiederum Funktionen aus meiner Werkzeugsammlung IsapiHlp verwenden. Beispielsweise erledigt die Funktion HtmlHeader die komplette Generierung eines HTML-Kopfes mit Titel, Hintergrundfarbe und Hintergrundbild bis einschließlich des einleitenden <BODY>-Tags. Die Funktion HtmlFooter am Ende schließt den HTML-Text wieder ab.
procedure IsapiAction(var s: String); var FldList: TstringList; i: Integer begin s:= HtmlHeader('ISAPI-Test','FFFFFF','/images/struct.gif') + '<H1>ISAPI-Test</H1><HR>'+... { Aufbau des dynamische HTML-Textes } s:= s + '<HR>[ ' + HtmlLink('/','Home') + ' ]' + '<P ALIGN="center">' + FormatDateTime(yy-mm-dd, hh:nn:ss',Now()) + '<BR>© Webmaster' + HtmlFooter; end; |
Als wesentliche Programmaktion ermitteln Sie in der hier entstehenden Test-DLL alle Eingabedaten und Servervariablen und senden sie an den Client zurück. Auch dazu bieten sich die Tools aus IsapiHlp an. ECBSize, ECBVersion usw. sind dort deklarierte Funktionen, mit denen Sie den Zugriff auf die Eingangsdaten noch etwas verkürzen.
s:= s + Format( '<H3>ECB-Variablen (Input)</H3>' + '<UL><LI>ECB-Size: %d' + '<LI>Version: %.8x' + '<LI>ConnID: %.8x' + '<LI>Method: %s' + '<LI>QueryString: %s' + '<LI>TotalBytes: %d' + '<LI>Available: %d</UL>', [ECBSize, ECBVersion, ECBConnID, ECBMethod, ECBQueryString, ECBTotalBytes, ECBAvailable]); |
Ähnlich gestalten Sie den Abruf der Servervariablen. Die Funktion GetVar kennen Sie ja bereits aus dem vorherigen Abschnitt von der Beschreibung der Eingangsvariablen.
s:= s + Format( '<HR><H3>Server-Variablen</H3>' + '<UL><LI>REMOTE_ADDR: %s' + '<LI>REMOTE_HOST: %s' + '<LI>HTTP_ACCEPT: %s' + '<LI>ALL_HTTP: %s' + '<LI>URL: %s</UL>', [GetVar('REMOTE_ADDR'), GetVar('REMOTE_HOST'), GetVar('HTTP_ACCEPT'), GetVar('ALL_HTTP'), GetVar('URL')]); |
Den kompletten Quelltext für die Test-DLL finden Sie als Projekt IsapiTst am Ende dieser Seite zum Download. Damit Sie Ihren Test noch schneller durchführen können, beachten Sie bitte folgende Hinweise.
Die fertige DLL plazieren Sie in das Serververzeichnis für ausführbare Scripte. Danach können Sie die Extension bereits über die Adreßzeile Ihres Browsers aufrufen.
http://hostname/scripts/IsapiTst.dll?TestParmeter |
Für den Test aus einem Formular heraus kopieren Sie das beiliegende Formular IsapiTest.htm in ein Verzeichnis Ihres Webs. Gegebenenfalls müssen Sie noch die Formularaktion umschreiben, um sie an Ihre Gegebenheiten anpassen. Die Bilder zeigen sowohl Formular als auch Antwort der ISAPI-Erweiterung.
Der Aufruf erfolgt mit:
http://MyServer/scripts/IsapiTab.dll?Zeilenzahl |
Setzen Sie für den Parameter Zeilenzahl einen beliebigen Zahlenwert ein. Ohne den Parameter werden 10 Tabellenzeilen generiert.
Der Hintergrund dieses ISAPI-Test-Projektes ist folgender: Einige Programmierer beklagen Probleme bei der Übertragung langer Dokumente. In solchen Fällen hat es geholfen, wenn in der Projektdatei bei Uses als erstes die Unit ShareMem aufgeführt wurde. Dann muß aber auch die Delphi-Speicherverwaltungs-DLL DELPHIMM.DLL bzw. BORLNDMM.DLL im System-Pfad Ihres Betriebssystems zu finden sein.
J. Hummel, 2000