In diesem Artikel wird hauptsächlich beschrieben, wie DELPHI und das Internet zusammenarbeiten. In diesem Artikel werden zwei spezielle Technologien detailliert beschrieben:
WININET: FTP-, HTTP- und Gopher-Client-Programme erstellen. ISAPI: Internet-Informationsdienste erweitern, z. B. Informationen auf dem Server abrufen und im Browser anzeigen.
In der heutigen Computerwelt wurde durch die Internetstrategie von Microsoft ein enormer Entwicklungstrend ausgelöst. diejenigen, die machen
Die Zeiten von CGI (Common Gateway Interface) und Tools von Drittanbietern selbst für die grundlegendsten Internet-Tools sind endgültig vorbei. Es wird immer einen Bedarf an ausgefeilten Tools von Drittanbietern geben, aber jetzt finden Programmierer die große Auswahl an Internet-Tools, die sie benötigen, in das Betriebssystem integriert. Kurz gesagt, Sie können ohne weitere Investitionen kostenlose DELPHI-Ressourcen nutzen:
*Entwickeln Sie einen WEB-Browser
*Führen Sie FTP, HTTP und Gopher zwischen zwei DELPHI-Anwendungen oder einer DELPHI-Anwendung und TCP aus
(Transmission Control Protocol) betreibt TCP zwischen Servern
Denn DELPHI kann problemlos die Windows-API aufrufen und unterstützt OCX/ActiveX, die neue Strategie von Microsoft
Die Strategie passte perfekt zu unserem Plan. Microsoft produziert Tools und DELPHI-Programmierer ernten die Früchte!
Was steht in diesem Artikel?
Dieser Artikel besteht aus drei Hauptteilen und einigen kleinen Teilen mit drei Hauptthemen:
*Finden Sie die Materialien: Die in diesem Artikel erwähnte technische Dokumentation ist dort verfügbar und enthält eine kurze Beschreibung der Hardware und Software, die Sie zum Ausführen des Codes in diesem Artikel benötigen.
*ISAPI: So verwenden Sie ISAPI
*WININET: So verwenden Sie WININET
In den meisten Fällen sind die Abschnitte ISAPI und WININET in diesem Artikel völlig unabhängig voneinander und Sie können die Reihenfolge, in der Sie sie lesen, frei wählen.
Hier finden Sie Informationen zu Hardware- und Softwareanforderungen
Sie benötigen eine Kopie von Microsoft Windows NT 3.51 Server oder NT 4.0 Server, der die Dokumentation zu den Internetinformationsdiensten beiliegen sollte, da Sie die darin genannten Technologien verstehen müssen. Dieses Dokument sollte in NT Server 4.0 enthalten sein und Benutzer von NT 3.51 können es von der Microsoft-Website herunterladen. Um Windows NT auszuführen, sollte die Mindestkonfiguration Ihres Computers 486-kompatibel sein und über 20 MB oder mehr Arbeitsspeicher verfügen.
Sie müssen über einen anderen Computer verfügen, auf dem ein Webbrowser installiert ist. Damit der ISAPI-Teil dieses Artikels reibungslos funktioniert, der zweite
Auf dem Computer muss jede Software ausgeführt werden können, die Webbrowser unterstützt. Wenn auf Ihrem Computer Windows 95 oder Windows NT läuft
Dann läuft der WININET-Codeteil in diesem Artikel am besten. In dieser technischen Umgebung kann jeder geeignete Webbrowser verwendet werden.
In Versionen von Delphi 2.0 und höher, die nach Juni 1996 veröffentlicht wurden, gibt es die Tools, die Sie benötigen, um Delphi mit dem Internet zu verbinden.
fast alle Ressourcen.
Wenn Sie nicht über die neueste Delphi-Version verfügen [Hinweis: Der Autor bezieht sich hier auf Version 2.0 (Übersetzer)], dann benötigen Sie diesen Artikel
Die in der Datei genannten Spezialdateien sind alle nahezu kostenlos im World Wide Web verfügbar [Hinweis: Wenn Sie Delphi 2.0 oder höher verwenden, dürfen Sie (Übersetzer) nicht in Betracht ziehen]. Alle in diesem Artikel erwähnten Techniken können in der Delphi2.0-Umgebung reibungslos funktionieren, in der 16-Bit-Delphi-Umgebung funktionieren sie jedoch möglicherweise nicht reibungslos.
Wenn Sie Informationen aus dem World Wide Web herunterladen müssen, lautet der Link: http://www.borland.com/TechInfo/delphi/i
index.html
[Hinweis: Es existiert nicht mehr! :-(( (Übersetzer)]
Die neue Version von Delphi2.0 wird mit dem Dokument WININET.PAS geliefert. Wenn Ihre Kopie es nicht enthält, dann die obige
World Wide Web Node kann dies für Sie bereitstellen. WININET.PAS enthält eine Liste von Variablen, Funktionen, Typen und Eigenschaften, die zur Erweiterung von Microsoft Windows Internet entwickelt wurden. Das bedeutet, dass Sie Ihren Anwendungen ganz einfach FTP-, HTTP- und Gopher-Unterstützung hinzufügen können. Die WININET.DLL von Microsoft wird kostenlos verteilt. Wenn sie sich nicht in Ihrem Windows/System- oder Windows/System32-Verzeichnis befindet, können Sie sie von Microsoft erhalten. Hier ist der World Wide Web-Knoten, auf dem die Hilfedatei für das WININET.H-Fenster verfügbar ist:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Hinweis: Es scheint, dass es nicht mehr verfügbar ist! : -( (Übersetzer)]
Im Allgemeinen ist das Online-Heim für Microsoft-Internetentwickler der INTDEV-Teil des Microsoft-Knotens.
Neben WININET und ICP ist ISAP eine weitere von Delphi unterstützte Schlüsseltechnologie. Wie in der Unternehmensdokumentation von Microsoft angegeben
Wie beschrieben ermöglicht Ihnen diese Technologie das „Schreiben“ serverseitiger Skripts und Filterskripts und erweitert so Microsoft Internet Information Services und andere ISAPI-Webdienste.
Wenn Sie eine Beschreibung zu ISAPI benötigen, gehen Sie zu:
http://www.microsoft.com/intdev/sdk/servapi.htm [Hinweis: Gott segne Sie! ;-) (Übersetzer)]
Am Ende dieses Artikels ist eine Kopie des ISAPI-Schlüsseldokuments mit dem Namen HTTPEXT.PAS angehängt.
Das von Microsoft kostenlos veröffentlichte Internet Control Pack (ICP) ist ein OCX/ActiveX-Steuerelementsatz, den Sie in Delphi verwenden können
Ziehen Sie sie per Drag-and-Drop in die Anwendung (Delphi 2.0 enthält diese Steuerelemente). Sie bieten sofortige Unterstützung bei der Erstellung von Delphi-Anwendungen und wissen, wie man im Internet surft, FTP, WINSOCK und andere Internettechnologien verwendet. Wenn Ihre Delphi-Kopie diese Steuerelemente nicht enthält, sollten Sie diese Dokumente dem Lib-Verzeichnis in dem Verzeichnis hinzufügen, in dem sich Delphi befindet, bevor Sie sie verwenden. Die Dokumente befinden sich auf der INDEX.HTML-Site von Borland unter dem oben genannten Link. ICP-Kontrollen habe ich in diesem Artikel nicht erwähnt, aber jeder, der sich für diese Technologie interessiert, sollte unbedingt bestätigen, dass er über diese verfügt
Eine Kopie der Kontrolle.
Sie können meine Pascal-Anwendungsdateien von meiner Website herunterladen. Sie heißen STRBOX.PAS und MATHBOX.PAS.
Es wäre von Vorteil, diese Website regelmäßig auf Aktualisierungen der in diesem Artikel genannten Informationen zu überprüfen.
Hier gehe ich davon aus, dass der Leser mit Delphi und Object Pascal vertraut ist und dass der Leser mit dem Internet, HTML usw. vertraut ist.
Sie verfügen über ein grundlegendes Verständnis von Browsern und World Wide Web-Servern.
ISAPI
ISAPI ist eine benutzerfreundliche und dennoch leistungsstarke Technologie, mit der Sie die Möglichkeiten von Internet-Informationsdiensten erweitern können.
Diese Technologie ist in Windows NT 4.0 enthalten und ermöglicht Ihnen die Erstellung von WEB-, FTP- und GOPHER-Sites auf Ihrem Server. Gleichzeitig ist diese Technologie mit WindowsNT3.51 Server kompatibel [Hinweis: Bezieht sich auf die Serverversion, die andere Version ist die Workstation-Version (Übersetzer)].
In der Vergangenheit bestand die beste Möglichkeit zur Skalierung eines Webservers darin, CGI-Anwendungen zu erstellen. Sie sind mächtige Werkzeuge, aber sie sind es auch
Begrenzt durch ihr Ausführungsformat [Hinweis: Beispielsweise wird PERL interpretiert und ausgeführt (Übersetzer)]. Wenn Sie über einen Browser eine CGI-basierte Anfrage an den Server stellen, wird die CGI-Anwendung höchstwahrscheinlich zuerst in den Speicher verschoben, was viel Zeit in Anspruch nimmt. Darüber hinaus scheint die Verwendung der CGI-Technologie unter bestimmten Umständen etwas schwieriger zu sein.
ISAPI ist eine Methode zum Ersetzen von CGI-Anwendungen durch das Schreiben von DLLs [Hinweis: Dynamic Link Program (Translator)]. Das können Sie auch
Es ist möglich, gefilterten Text über ISAPI zu schreiben, aber ich werde diese Technologie in diesem Artikel nicht erwähnen. Im Vergleich zu CGI ist ISAPI einfacher zu verwenden, schneller und nutzt die Systemressourcen besser aus. In den folgenden Punkten erkläre ich im Detail, warum ISAPI-DLLs besser sind als CGI-Anwendungen:
ISAPI-DLLs befinden sich an derselben Adresse wie der HTTP-Dienst, sodass sie direkt vom Server aus auf den HTTP-Dienst zugreifen können. Im Vergleich zu CGI-Anwendungen können sie schneller in den Speicher geladen werden; wenn sie eine Anfrage an den Server stellen, benötigen sie weniger Pausenzeit [Hinweis: bezieht sich auf die Zeit zwischen der Anfrage und dem Empfang einer Antwort vom Server (Übersetzer)] Viel. Dies ist umso wichtiger, wenn der Server stark ausgelastet ist.
Sie können steuern, wann DLLs geladen und entladen werden. Beispiel: Sie können DLLs bei der ersten Anfrage vorab laden
Entladen Sie die ISAPI-Anwendungs-DLLs, wenn sie nicht verwendet werden, um Systemressourcen freizugeben.
Wie bereits erwähnt, können Sie ISAPI verwenden, um gefilterten Text zu schreiben [Hinweis: bezieht sich im Allgemeinen auf Skripte in der C/S-Struktur (Übersetzer)] und mehr
Laut der Dokumentation von Microsoft können Sie Text über ISAPI filtern, um Folgendes zu tun:
Benutzerautorisierungsschema
Kompression
Verschlüsselung
Login
Verkehrsanalyse oder andere Anfrageanalyse (z. B. Suche nach Anfragen in „....etcpassWord“)
In diesem Artikel werde ich mich darauf konzentrieren, wie man DLLs schreibt, die Datensätze zurückgeben, oder wie man mit Benutzern interagiert, die Browser ausführen.
Nehmen Sie einfach Kontakt auf.
ISAPI-Grundlagen
Die Datei HTTPEXT.PAS enthält Schlüsselanweisungen für die Verwendung von ISAPI. Dieses Dokument sollte dem beiliegen
Delphi-Version verteilt. Es ist auch auf der Website von Borland zu finden, die dem ISAPI-Abschnitt dieses Artikels beigefügt ist. Da dies auf NT-Technologie basiert, müssen Sie Delphi 2.0 oder höher verwenden, um diese Technologie anzuwenden. Sie können dies nicht auf einem 16-Bit-Editor verwenden.
HTTPEXT.PAS enthält die Schnittstelle der von Microsoft erstellten ISAPI-Technologie [Hinweis: Bezieht sich auf die Delphi-Schnittstelle, ISAPI ist in C++ kompiliert
Schreiben (Übersetzer)]. Beim Schreiben von Delphi wird keine ISAPI-Benutzeroberfläche bereitgestellt. Ich beschreibe nur, wie die vorhandene Technologie von Microsoft verwendet wird. Allerdings ist ISAPI zu einfach zu verwenden und für die meisten Benutzer ist die Version des Delphi-Objekts des Benutzers nicht erforderlich.
Es gibt drei Funktionen, die als Zugang zu ISAPI-DLLs verwendet werden können. Die ersten beiden sind erforderlich und die dritte ist optional.
GetExtensionVersion: Überprüfen Sie die Mindestversion
HttpExtensionPRoc: Dies ist der Einstiegspunkt der DLL, genau wie der begin...end-Block in einer Delphi-Anwendung
TerminateExtension: Dies ist ein optionales Programm, das als Thread zum Bereinigen anderer Speicherzuordnungen verwendet werden kann.
Wenn Sie eine ISAPI-DLL erstellen, müssen Sie auf die ersten beiden der drei oben aufgeführten Funktionen verweisen und diese ausführen
Zwei Funktionen sind der Schlüssel zu jeder ISAPI-Programmierung.
Alle drei Anweisungen enthalten „Wortausgabe“, ein Begriff, der verwendet wird, weil ISAPI-DLLs Internetinformationsdienste erweitern
Gerät. (Denken Sie daran, dass sich Internet Information Server auf Microsoft Server bezieht. Wenn Sie einen NT-Server als physischen Webserver verwenden möchten, dann ist dies genau das Tool, das Sie benötigen. ISAPI-DLLs werden mit NT4.0 verteilt und bei der Installation des Betriebssystems installiert . wird automatisch installiert.)
ISAPI bietet einen Standard, dem Produktionsserver folgen können. Es kann beispielsweise die komplexe NSAPI-Schnittstelle von Netscape nutzen
Komprimiert auf die entsprechende prägnante und schöne ISAPI zum Betrieb der NSAPI-Schnittstelle.
Im Folgenden finden Sie die Erklärung dieser beiden wichtigen Funktionen
function GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL; stdcall;
function HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD;
Sie fügen einfach GetExtensionVersion in Ihre DLLs ein und schon sind Sie fertig. Sie müssen nur noch geringfügige Änderungen vornehmen, wenn ISAPI neue Versionen für die Öffentlichkeit veröffentlicht.
Funktion GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; stdcall;
beginnen
Ver.dwExtensionVersion := $00010000; // 1.0-Unterstützung
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL'; // Beschreibung
Ergebnis := True;
Ende;
Der an diese Funktion übergebene Parameter wird in HTTPEXT.PAS wie folgt deklariert:
Die relevanten Parameter werden in HTTPEXT.PAS wie folgt deklariert:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = gepackter Datensatz
dwExtensionVersion: DWORD;
lpszExtensionDesc: array[0..HseMaxExtDLLNameLen-1] of Char;
Ende;
Die Konstante HseMaxExtDllNameLen hat in der Deklaration den Wert 256. Die beiden Variablen im Datensatz sind „selbstdeklariert“. Erstere enthält die ISAPI-Versionsnummer [Hinweis: die Variable dwExtensionVersion (Übersetzer)] und letztere stellt eine benutzerdefinierte Zeichenfolge dar, die zur Beschreibung von DLLs verwendet wird.
Wenn Sie auf die GetExtensionVersion-Anweisung verweisen, müssen Sie Eingaben zum DPR-Dateiabschnitt Ihres DLL-Programms hinzufügen.
aus Teil. Während Sie diese Erklärung schreiben, sollten Sie auch Folgendes schreiben:
Exporte
GetExtensionVersion
HttpExtensionProc;
Dies tun Sie, wenn Sie Funktionen für diese beiden wichtigen ISAPI-DLLs einrichten. Der nächste Schritt, die Verwendung von HttpExtensionProc, ist etwas komplizierter, daher belasse ich ihn in einem separaten Abschnitt.
Arbeiten mit HttpExtensionProc
Die HttpExtensionProc-Anweisung ist der Einstiegspunkt der DLL. Seine Funktion ähnelt der main()-Anweisung in der C-Sprache oder
Der Anfang...Endteil in Delphi
Hier ist ein einfaches Beispiel mit der GetExtensionVersion-Anweisung
Funktion HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD; stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
'
„Hallo von ISAPI
' +
';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Inhaltstyp: text/html'#13#10+
'Inhaltslänge: %d'#13#10+
'Inhalt:'#13#10#13#10'%s'
[Länge(ResStr)
ResStr]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
Wenn Sie beim Surfen eine Anfrage an diese DLL stellen, erhalten Sie eine Antwort wie diese:
Testserverergebnisse
Hallo von ISAPI
Die meisten Felder im Funktionskörper stehen in engem Zusammenhang mit einfachem HTML-Code, der grundlegende Informationen bereitstellt. Sie müssen auch einige Felder im TExtensionControlBlock ausfüllen, wie unten gezeigt.
Beachten Sie, dass es in diesem Datensatz einen Funktionszeiger namens WriteClient gibt. Sie können auf diese Funktion verweisen, um Informationen zu übergeben
Zurück an den Browser senden. Beim Aufruf dieser Funktion verwenden Sie das ConnID-Feld im unten erwähnten TExtensionControl-Block. Wenn die Funktion aufgerufen wird, wird die ConnID automatisch für Sie ausgefüllt.
Bevor ich mir den Code der Funktion ansehe, möchte ich Ihnen bitte alle oben genannten HttpExtensionProc-Funktionen demonstrieren
Komplettes Programm der ISAPI DLL
Bibliothek Isapi1;
Bibliothek Isapi1;
verwendet
Windows
SysUtils
HTTPExt;
function GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
beginnen
Ver.dwExtensionVersion := $00010000; // Wir erwarten Unterstützung für Version 1.0
Ver.lpszExtensionDesc := 'Geschrieben in Delphi 2.0';
Ergebnis := True;
Ende;
function HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): DWORD;
stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
Testserverergebnisse
' +
'
Isapi sagt Hallo zu DevRel
';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Inhaltstyp: text/html'#13#10+
'Inhaltslänge: %d'#13#10+
'Inhalt:'#13#10#13#10'%s'
[Länge(ResStr)
ResStr]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
Exporte
GetExtensionVersion
HttpExtensionProc;
beginnen
Ende.
Um dieses DLL-Programm auszuführen, sollten Sie es in das Skriptverzeichnis Ihres NT-Servers kopieren. In meiner NT4.0-Maschine
Es geht so:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
In diesem Beispiel habe ich mein Verzeichnis mit dem Namen „mystuff“ erstellt.
Es dient nur dazu, das zu speichern, was ich erstellt habe
ISAPI-DLLs. Ihr Verzeichnis wird natürlich nicht genau das gleiche sein wie auf meinem Rechner, abhängig vom Speicherort Ihres „inetsrv“-Verzeichnisses und anderen Faktoren.
Um diese DLL erfolgreich aufzurufen, sollten Sie diesen Hyperlink zu Ihrer HTML-Seite hinzufügen:
ISAPI One
Wenn der Benutzer auf diesen Hyperlink klickt, wird die ISAPI1-DLL aufgerufen und anschließend die Zeichenfolge „Hallo von ISAPI“ angezeigt
im Browser des Benutzers angezeigt. Wenn Sie ISAPI.DLL nicht im mystuff-Verzeichnis ablegen, sollten Sie den obigen HTML-Code ändern, um ihn an Ihre Situation anzupassen. Beachten Sie, dass Ihr Verzeichnis relativ zum Verzeichnis inetsrv sein muss und nicht das Verzeichnis enthalten darf und darf, in dem sich Ihre gesamte DLL befindet.
Hier ist das vollständige HTML-Skript des Aufrufs:
Dies ist die Homepage meines Heimcomputers.
ISAPI One
Beachten Sie, dass Sie das Programm ISAPI1.DLL mehrmals in das Mystuff-Verzeichnis kopieren sollten
Schließen Sie den World Wide Web-Port des Webservers. Dies liegt daran, dass Sie beim ersten Kopieren dieser DLL frei von Einschränkungen sind, danach jedoch zum Server gehört. Wenn Sie daher die aktualisierte Version der ersten Kopie kopieren, sollten Sie den World Wide Web-Dienst deaktivieren. Mit einem Netzwerkverwaltungsprogramm können Sie den World Wide Web-Dienst deaktivieren. Dieses Programm sollte sich in der Microsoft Internet Server-Gruppe befinden und bei der Installation von Network Information Services im Explorer/Programm-Manager installiert werden.
Funktioniert mit TExtensionControlBlock
An diesem Punkt in diesem Artikel können Sie Ihre erste ISAPI-DLL erstellen und online auf einem zweiten Computer ausführen.
Der Webbrowser ruft es auf.
Der Rest von ISAPI wird in diesem Artikel ausführlicher behandelt.
Hier ist der kompliziertere Teil der HttpExtensionProc-Parameter
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = gepackter Datensatz
cbSize: DWORD; // = sizeof(TExtensionControlBlock)
dwVersion: DWORD; // Versionsinformationen dieser Spezifikation
ConnID: HCONN; // Kontext Nicht ändern!
dwHttpStatusCode: DWORD; // HTTP-Statuscode
// nullterminierte Protokollinformationen speziell für diese Erweiterungs-DLL
lpszLogData: Array [0..HSE_LOG_BUFFER_LEN-1] von Char;
lpszMethod: PChar; // REQUEST_METHOD
lpszQueryString: PChar; // QUERY_STRING
lpszPathInfo: PChar; // PATH_INFO
lpszPathTranslated: PChar; // PATH_TRANSLATED
cbTotalBytes: DWORD; // Gesamtbytes vom Client
cbAvailable: DWORD; // Verfügbare Anzahl an Bytes
lpbData: Zeiger; // Zeiger auf cbAvailable Bytes
lpszContentType: PChar; // Inhaltstyp der Clientdaten
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
ServerSupportFunction: TServerSupportFunctionProc;
Ende;
Beachten Sie, dass dieser Datensatz das oben erwähnte ConnID-Feld enthält und den ersten Parameter an WriteClient übergibt.
Der erste Parameter in diesem Datensatz dient der Versionskontrolle. Es sollte die Größe des angegebenen TExtensionControlBlocks haben. Wenn Microsoft seine Struktur ändert, können sie anhand der Datensatzgröße feststellen, um welche Version der Struktur es sich handelt. Die ersten drei Felder in diesem Datensatz benötigen Sie nie, sie wurden bereits von ISAPI ausgefüllt und können in Ihrem Programm nur aufgerufen, aber nicht geändert werden.
Das wahrscheinlich wichtigste Feld in diesem Datensatz ist lpszQueryString, das die Anfrage vom Server enthält
Information. Angenommen, Sie haben eine Datei namens ISAPI1.Dll erstellt. Um diese DLL aufzurufen, erstellen Sie auf einer Seite in Ihrem Browser eine HREF wie diese [Hinweis: ein Format in HTML-Sprache (Übersetzer)]:
Test eins
Wenn Sie auf diese DLL antworten möchten, müssen Sie die obige Zeile wie folgt ändern:
Test eins
Wenn das HTML-Code-Snippet etwa die zweite der beiden Zeilen oben enthält, verfügt Ihre DLL über den Parameter lpszQueryString
Rufen Sie die Zeichenfolge „MyQuery“ ab und achten Sie besonders auf die Verwendung des Anforderungsflags nach der Anforderungszeichenfolge.
Natürlich können Sie die Anforderungszeichenfolge beliebig ändern. Sie können zum Beispiel schreiben:
Test eins
Bei dieser Anfrage antwortet diese DLL mit dem Namen des Servers. Bei der Übergabe dieses Parameters unterliegen Sie keinen Einschränkungen. Du
Sie können übergeben, was Sie wollen, und es liegt an Ihnen, wie Sie die Informationen in der DLL analysieren möchten.
Wenn Sie Informationen vom Server an den Browser zurückgeben, verwenden Sie in diesem Datensatz den Funktionszeiger „WriteClient“.
. Sie müssen bei der Initialisierung dieses Zeigers nichts tun; er wird Ihnen automatisch vom Netzwerkinformationsserver übergeben.
Autoren von CGI-Anwendungen werden feststellen, dass die Syntax für die Übergabe von Anforderungszeichenfolgen sehr vertraut ist. Tatsächlich folgte ISAPI CGI
Wie bei den meisten Konventionen können die meisten Felder in TExtensionControlBlock einfach durch CGI-Technologie ausgeliehen werden.
Ein weiteres Schlüsselfeld in TExtensionControlBlock ist lpbData, das zusätzliche Informationen enthält, die Ihnen beim Surfen hochgeladen wurden.
Wenn Sie beispielsweise ein HTML-Formular mit mehreren Feldern haben, heißen die in diesen Feldern enthaltenen Informationen „
lpData“-Zeiger. Das nächste Thema in diesem Artikel, „Informationen über die Schaltfläche „OK“ abrufen“, konzentriert sich auf den Umgang mit dieser Situation.
Bisher habe ich die vier Schlüsselfelder in TExtensionControlBlock eingeführt:
WriteClient: Ein Zeiger, der es Ihnen ermöglicht, formatierte HTML-Daten an den Browser zu übergeben. Diese Funktion wird verwendet
ConnID-Feld von TExtensionControlBlock.
lpszQueryString: Die vom Browser kommende Anfrage.
lpbData: Zusätzliche Daten, die vom Browser zu Ihnen hochgeladen wurden. Normalerweise der Inhalt eines beliebigen Felds in einem HTML-Formular
. Ich werde dies im Abschnitt „Bestätigungsschaltfläche“ weiter besprechen.
Um ein Gefühl dafür zu bekommen, wie die anderen Felder in TExtensionControlBlock funktionieren, gehen Sie am besten wie folgt vor
Durchsuchen und vergleichen Sie sie. Mit anderen Worten: Sie möchten eine HTML-Seite erstellen, die es dem Benutzer ermöglicht, die ISAPI-DLL des Clients aufzurufen. Der Zweck dieser ISAPI-DLL besteht einfach darin, jedes Feld im TExtensionControlBlock in HTML zu formatieren und sie dann an den Browser zurückzugeben. Dadurch wird Ihr Browser zu einem etwas gruseligen Debugger, der alle Felder im TExtensionControlBlock anzeigt.
Hier ist ein Programm, geschrieben von Danny Thorpe von Borland, das diese Aufgabe ausführt:
Bibliothek test1;
verwendet
Windows
SysUtils
HTTPExt;
function GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
beginnen
Ver.dwExtensionVersion := $00010000; // 1.0-Unterstützung
Ver.lpszExtensionDesc := 'Eine in Delphi 2.0 geschriebene Test-DLL';
Ergebnis := True;
Ende;
Funktion HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD; stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
Buf: Array [0..1024] von Char;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := Format(
' +
'
'Größe = %d
'+
'Version = %.8x
'+
'ConnID = %.8x
'+
'Methode = %s
' +
'Abfrage = %s
' +
'PathInfo = %s
'+
'PathTranslated = %s
'+
'TotalBytes = %d
'+
'AvailableBytes = %d
'+
'ContentType = %s
'+
'
[ECB.cbSize
ECB.dwVersion
ECB.ConnID
ECB.lpszMethode
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathTranslated
ECB.cbTotalBytes
ECB.cbVerfügbar
ECB.lpszContentType]);
mit der EZB tun
beginnen
StrLen := Sizeof(Buf);
GetServerVariable(ConnID
'REMOTE_ADDR'
@Buf
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'REMOTE_HOST'
@Buf
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'REMOTE_USER'
@Buf
StrLen);
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVER_NAME'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVER_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVER_PROTOCOL'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVER_SOFTWARE'
@Buf
StrLen);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'ThreadID = %.8x
'
[ResStr
Buff
GetCurrentThreadID]);
Ende;
ResStr := ResStr + ';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Inhaltstyp: text/html'#13#10+
'Inhaltslänge: %d'#13#10+
'Inhalt:'#13#10#13#10'%s'
[Länge(ResStr)
ResStr]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
xports
GetExtensionVersion
HttpExtensionProc;
egin
Ende.
Um diese DLL aufzurufen, sollten Sie ein HRML-Skript erstellen, das die folgende Zeile enthält
Test eins
Informationen erhalten Sie über die Schaltfläche „Bestätigen“.
Normalerweise verfügen HTML-Formulare, die Ihnen Informationen senden, über eine Schaltfläche zum Bestätigen. Solange die Informationsmenge weniger als 49 KB beträgt, ist dies möglich
Betrachten Sie das Feld lpbData in TExetentionControlBlock als verfügbar. Hier erfahren Sie, wie Sie es können
In den meisten Fällen werden die vom Zeiger auf dieses Feld gesendeten Informationen wie folgt abgerufen:
var
S: Schnur;
beginnen
…
S := PChar(ECB.lpbData);
…
Ende;
Wenn die aus diesem Feld kommenden Informationen größer als 48 KB sind, müssen Sie ReadClient aufrufen, um die restlichen Informationen abzurufen.
Wenn Sie genau wissen möchten, welche Informationen im Feld lpbData verfügbar sind, können Sie die Daten mit den folgenden beiden Funktionen an Ihren Webbrowser zurückgeben:
Funktion SetUpResString: string;
beginnen
Ergebnis := ' +
' +
'
'lpbData = %s ' +
';
Ende;
Funktion HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD; stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
S
S1: Zeichenfolge;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
Angenommen, Sie haben bereits ein HTML-Formular mit dem folgenden angehängten Code:
Dieser Code erstellt ein Formular mit einem Textbereich, in den Sie Zahlen eingeben können, und einer „Senden“-Schaltfläche namens „GetSquare“. Wenn Sie über dieses Formular verfügen, können Sie davon ausgehen, dass die beiden oben genannten Programme die folgende Zeichenfolge zurückgeben, vorausgesetzt, der Benutzer gibt die Zahl 23 in den Textbereich des Formulars ein:
lpbData = GetSquare=23&GetSquare=Senden
Um zu verstehen, was zu diesem Zeitpunkt passiert, achten Sie auf den Hauptteil der HTML-Anweisung aus der obigen Funktion. Dieser Teil der Anweisung befindet sich auf dem Server und wird wie folgt wiedergegeben:
'lpbData = %s ' +
Wenn Sie den Code in der Funktion HttpExtensionProc oben studieren, werden Sie feststellen, dass direkt vor diesem Satz der Parameter %s in der Formatanweisung anstelle des Werts in ECB.lpbData verwendet wird. (Wenn Sie nicht wissen, wie die Anweisung „Format“ funktioniert, lesen Sie bitte die entsprechende Delphi-Dokumentation) [Hinweis: In der Delphi2 Programming Encyclopedia des Autors (Delphi2
Detaillierte Anweisungen finden Sie in Kapitel 3 „Strings und Textdateien“ in Unleashed (Translator)]
Nehmen Sie an, dass in der oben gezeigten Form, wenn der Benutzer auf die Schaltfläche „Bestätigen“ klickt, der von lpbData an die ISAPI-DLL übergebene Wert wie folgt lautet:
GetSquare=23&GetSquare=Senden
Um Ihnen eine klare Vorstellung zu geben, möchte ich wiederholen, dass es sich bei den durch die beiden obigen Anweisungen an den Browser zurückgegebenen Informationen um die folgende Zeichenfolge handelt, die Sie bereits gesehen haben:
lpbData = GetSquare=23&GetSquare=Senden
Der beste Weg, diesen Prozess zu sehen, besteht darin, das unten aufgeführte ISAPI2-Programm zu testen. ISAPI2 ähnelt ISAPI1, enthält jedoch die oben gezeigte neue HttpExtensionProc-Funktion und außerdem die Dienstprogrammfunktion SetUpResString.
Bibliothek Isapi2;
verwendet
Windows
SysUtils
HTTPExt;
Funktion GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; stdcall;
beginnen
Ver.dwExtensionVersion := $00010000; // 1.0-Unterstützung
Ver.lpszExtensionDesc := 'DLL geschrieben in Delphi 2.0';
Ergebnis := True;
Ende;
Funktion SetUpResString: string;
beginnen
Ergebnis := ' +
' +
'
'lpbData = %s ' +
';
Ende;
Funktion HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD; stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
S
S1: Zeichenfolge;
Länge: Ganzzahl;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
Exporte
GetExtensionVersion
HttpExtensionProc;
beginnen
Ende.
Sobald Sie die von der lpbData-Variablen übergebenen Informationen aus dem Formular erhalten haben, können Sie die Informationen analysieren oder an den Benutzer zurückgeben. Sie könnten beispielsweise die Zahl 23 aus dem obigen Beispiel extrahieren, quadrieren und an den Benutzer zurückgeben. Auf diese Weise können Sie Informationen vom Benutzer abrufen, in diesem Fall Zahlen, einige mathematische Operationen an den Zahlen durchführen und schließlich das Ergebnis an den Benutzer zurückgeben. Das bedeutet, dass Sie interaktive Webseiten direkt auf Sendung erstellen können, was derzeit der beliebteste Aspekt der Internetprogrammierung ist!
Das Folgende ist ein vollständiger Programmcode, der das Quadrat einer Zahl über das Netzwerk an den Browser übermittelt:
Bibliothek Isapi3;
{ Dieser Code zeigt, wie Eingaben des Benutzers über einen Browser entgegengenommen werden
Analysieren Sie diese Informationen
und geben Sie dann insbesondere eine Antwort an den Benutzer zurück
Der Benutzer gibt eine Nummer ein
Dieser Code gleicht es aus
und sendet das Ergebnis dann an den Benutzer zurück. Hier ist das Formular des Browsers, das die Informationen zur Analyse übermittelt:
}
verwendet
Windows
SysUtils
HTTPExt
StrBox;
Funktion GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; stdcall;
beginnen
Ver.dwExtensionVersion := $00010000; // Version 1.0-Unterstützung
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Ergebnis := True;
Ende;
// lpbData analysieren und die Nummer abrufen, die der Benutzer uns übergeben hat.
Funktion ParseData(S: string): Integer;
beginnen
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Ergebnis := StrToInt(S);
Ende;
Funktion SetUpResString: string;
beginnen
Ergebnis := ' +
' +
'
'Antwort = %d ' +
';
Ende;
Funktion HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD; stdcall;
var
ResStr: string;
StrLen: Ganzzahl;
S
S1: Zeichenfolge;
Num: Ganzzahl;
beginnen
ECB.lpszLogData := 'Delphi DLL-Protokoll';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Num := ParseData(S);
Num := Sqr(Num);
ResStr := Format(ResStr
[Anzahl]);
StrLen := Länge(ResStr);
ECB.WriteClient(ECB.ConnID
Zeiger(ResStr)
StrLen
0);
Ergebnis := HSE_STATUS_SUCCESS;
Ende;
Exporte
GetExtensionVersion
HttpExtensionProc;
beginnen
Ende.
Dieser Code akzeptiert die folgende Zeichenfolge von dem Benutzer, der die Bestätigungstaste gedrückt und nach der quadrierten Zahl gefragt hat:
GetSquare=5&GetSquare=Senden
Unter der Annahme einer solchen Eingabe gibt dieser Code über das Internet die folgende Zeichenfolge an den Benutzer zurück:
Antwort = 25
In einem Satz gibt der Benutzer die Zahl 5 ein und Sie geben dem Benutzer die Zahl 25 zurück. Wenn der Benutzer die Zahl 10 übermittelt, geben Sie die Zahl 100 zurück. Das mag trivial erscheinen, aber was hier zählt, ist, was im Internet passiert [Anmerkung: bezieht sich auf interaktive Webseiten (übersetzt
WHO)]
Analysieren Sie die vom Benutzer übergebene Funktion wie folgt:
// lpbData analysieren und die Nummer abrufen, die der Benutzer uns übergeben hat.
Funktion ParseData(S: string): Integer;
beginnen
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Ergebnis := StrToInt(S);
Ende;
Diese beiden Aussagen befinden sich in der am Anfang dieses Artikels erwähnten Einheit und sind auch auf meiner Website enthalten. [Hinweis: Dieses Dokument ist fast überall im Internet zu finden
Sie können es auch beim Übersetzer (Übersetzer) anfordern][In diesem Artikel
Ich möchte einfach so viel über ISAPI reden. Dies sollte ausreichen, um Sie dazu zu inspirieren, Spaß daran zu haben, diese großartige Technologie zu nutzen. Als nächstes möchte ich auf die beiden Anweisungen GetServerVariable und ReadClient eingehen. Ich habe diesbezüglich nur äußerst begrenzte Experimente durchgeführt. In diesem Artikel habe ich die Datei HTTPEXT.PAS angehängt, da Sie sie nirgendwo anders als in diesem wichtigen Dokument finden.
GetServerVariable- und ReadClient-Anweisungen
Genau wie beim Anfordern von Informationen in Ihrer CGI-Anwendung können Sie Anweisungen verwenden, um Informationen vom Server abzurufen. Hier ist ein Beispiel für den Aufruf dieser Anweisung:
Len := HseMaxExtDllNameLen;
SetLength(S1
Len);
Dez(Len);
ECB.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
Len);
Dieser Code legt zunächst die Länge des Puffers fest, der die vom Server abgerufenen Informationen enthält. Anschließend ruft es den Server an und stellt eine Anfrage. In diesem Fall fragt es nach der „CONTENT_LENGTH“ der Nachricht vom Server.
In der Microsoft-Dokumentation erfahren wir, dass Sie die folgende Zeichenfolge als zweiten Parameter von GetServerVariable übergeben können:
AUTH_TYPE Es enthält die Art der verwendeten Autorisierung. Wenn Sie beispielsweise die Basisautorisierung verwenden, dann
Die Zeichenfolge ist „basic“; wenn es sich um eine NT-Challenge-Response handelt, lautet die Zeichenfolge „NTLM“. Andere Berechtigungen haben spezifische entsprechende Zeichenfolgen. Da dem Server ständig neue Autorisierungstypen hinzugefügt werden, ist es nicht möglich, alle möglichen Zeichenfolgen aufzulisten. Wenn die Zeichenfolge leer ist, wird keine Autorisierung verwendet.
CONTENT_LENGTH Die Anzahl der Bytes, die das Skript voraussichtlich vom Client zurückfordern wird.
CONTENT_TYPE Der Inhaltstyp der Informationen, die vom Hauptteil der Anforderungsanzeige bereitgestellt werden. [Anmerkung: Der jüngere Bruder ist weniger talentiert und weniger sachkundig, a
POST-Anfrage wird vorübergehend als „Anfragebenachrichtigung“ übersetzt, bitte korrigieren Sie mich (Übersetzer)]
PATH_INFO Zusätzliche Routing-Informationen, bereitgestellt vom Client. Es enthält den Pfad zur URL, der dem Skriptnamen folgt
Abhängig von. Wenn vorhanden, geht es der Anforderungszeichenfolge voraus.
Path_translated Dies ist der Wert von Path_info, enthält jedoch die Namen aller virtuellen Routen, die auf ein Pfadflag erweitert werden.
Query_String Die Informationen folgen in der URL, die sich auf dieses Skript bezieht.
Remote_Addr Die IP -Adresse des anfordernden Clients oder seines Agenten (z. B. ein Gateway oder eine Firewall).
Remote_Host Der Hostname des anfordernden Clients oder seines Agenten (z. B. ein Gateway oder eine Firewall).
Remote_user Dies enthält den vom Client bereitgestellten und vom Server autorisierten Benutzernamen. Wenn eine leere Zeichenfolge zurückgegeben wird, dann der Benutzer
in Ihrem Namen (aber mit Autorisierung).
UNMAPKEL_REMOTE_USER Es ist der Name eines Benutzers mit folgenden Eigenschaften: Dieser Benutzer stellt eine Anforderung an das NT -Benutzerkonto (dies ist seine Identität), vor dem der ISAPI -Anwendungsfilter den Benutzer abgebildet hat.
Request_method ist die HTTP -Anforderungsmethode.
Script_name Der Name des ausgeführten Skripts.
Server_Name Die Hostname oder IP-Adresse, wenn sie in selbstreferenziellen URLs angezeigt wird.
Server_port Der TCP/IP -Port, der Anforderungen akzeptiert.
Server_port_secure eine Zeichenfolge, die entweder 0 oder 1 ist. Es ist 1, wenn die Anfrage von einem sicheren Anschluss behandelt wird;
Server_Protocol akzeptiert den Namen und die Version der dieser Anfrage zugeordneten Protokollinformationen. Es ist normalerweise HTTP/1.0.
Server_software ist der Name und die Version des Webservers, auf dem das ISAPI -Anwendung DLL -Programm ausgeführt wird. All_http Die vorherige Variable hat nicht alle HTTP -Header analysiert. Diese Variablen stammen aus http_ <Feldzeilenname>. Feldheader (durch Linienmarkierungen getrennt) enthalten einzelne Zeichenfolgen, die nicht beendet werden.
Http_accept Spezialfall von HTTP -Feldkopf. Akzeptierte Werte sind: Felder, die durch Kommas (,) getrennt sind. Zum Beispiel: if
Die folgenden Zeilen sind Teil des HTTP -Headers:
Akzeptieren: */ *, q = 0,1
Dann gibt die URL (eine neue Funktion in Version 2.0) ihren grundlegenden Teil.
Beachten Sie, dass das oben angegebene Informationsstück automatisch von dem textliche ControlBlock -Datensatz übergeben wird. Weil
Sie müssen GetServerVariable nicht dafür anrufen. Sie können es jedoch anrufen, wenn Sie es wirklich benötigen, insbesondere wenn Sie Informationen von ReadClient erhalten möchten und wissen müssen, wie viele Informationen zu lesen sind.
Oft müssen Sie nicht ReadClient anrufen. Die Größe der von Ihrem Browser gesendeten Nachricht beträgt jedoch größer als 48 KB
Zeit müssen Sie ReadClient anrufen, um den Rest der Informationen zu erhalten.