Cet article décrit principalement comment faire fonctionner DELPHI et Internet ensemble. Deux technologies spécialisées seront détaillées dans cet article :
WININET : Créez des programmes clients FTP, HTTP et Gopher. ISAPI : Développez les services d'information Internet, par exemple, obtenez des informations sur le serveur et affichez-les sur le navigateur.
Dans le monde informatique d'aujourd'hui, une énorme tendance de développement a été déclenchée par la stratégie Internet de Microsoft. ceux qui font
L’époque du CGI (Common Gateway Interface) et des outils tiers, même pour les outils Internet les plus élémentaires, est enfin révolue. Il y aura toujours besoin d'outils tiers sophistiqués, mais les programmeurs trouveront désormais la vaste gamme d'outils Internet dont ils ont besoin intégrés dans le système d'exploitation. En bref, sans investissement supplémentaire, vous pouvez utiliser les ressources DELPHI gratuites pour :
*Développer un navigateur WEB
*Exécutez FTP, HTTP et Gopher entre deux applications DELPHI ou une application DELPHI et TCP
(Transmission Control Protocol) exploite TCP entre les serveurs
Parce que DELPHI peut facilement appeler l'API Windows et qu'il prend en charge OCX/ActiveX, la nouvelle stratégie de Microsoft
La stratégie correspond parfaitement à notre plan. Microsoft produit des outils et les programmeurs DELPHI en récoltent les fruits !
Qu'y a-t-il dans cet article ?
Cet article contient trois grandes parties et quelques petites parties, avec trois thèmes majeurs :
*Trouver le matériel : la documentation technique mentionnée dans cet article est disponible ici et comprend une brève description du matériel et des logiciels dont vous aurez besoin pour exécuter le code dans cet article.
*ISAPI : Comment utiliser ISAPI
*WININET : Comment utiliser WININET
Dans la plupart des cas, les sections ISAPI et WININET de cet article sont totalement indépendantes et vous êtes libre de choisir l'ordre dans lequel vous les lisez.
Trouver des informations, la configuration matérielle et logicielle requise
Vous aurez besoin d'une copie de Microsoft Windows NT 3.51 Server ou NT 4.0 Server, qui doit être accompagnée de la documentation Internet Information Services, car vous devrez comprendre les technologies qui y sont mentionnées. Ce document doit être inclus avec NT Server4.0 et les utilisateurs de NT 3.51 peuvent le télécharger depuis le site Web de Microsoft. Pour exécuter Windows NT, la configuration minimale de votre ordinateur doit être compatible 486 et disposer de 20 Mo ou plus de mémoire.
Vous devez disposer d'un autre ordinateur sur lequel un navigateur Web est installé. Afin que la partie ISAPI de cet article fonctionne correctement, la deuxième
La machine doit être capable d'exécuter tous les logiciels prenant en charge les navigateurs Web. Si votre ordinateur exécute Windows 95 ou Windows NT
Ensuite, le morceau de code WININET de cet article fonctionnera mieux. Tout navigateur Web éligible peut être utilisé dans cet environnement technique.
Dans les versions de Delphi 2.0 et supérieures publiées après juin 1996, vous disposez des outils dont vous avez besoin pour connecter Delphi à Internet.
presque toutes les ressources.
Si vous ne disposez pas de la dernière version de Delphi [Remarque : l'auteur fait ici référence à la version 2.0 (traducteur)], alors vous avez besoin de cet article.
Les fichiers spéciaux mentionnés dans le fichier, qui sont tous disponibles presque gratuitement sur le World Wide Web [Remarque : si vous utilisez Delphi2.0 ou supérieur, vous n'êtes pas autorisé à considérer (Traducteur)]. Toutes les techniques mentionnées dans cet article peuvent fonctionner correctement dans l'environnement Delphi 2.0, mais elles peuvent ne pas fonctionner correctement dans l'environnement Delphi 16 bits.
Si vous avez besoin de télécharger des informations depuis le World Wide Web, le lien est : http://www.borland.com/TechInfo/delphi/i
index.html
[Remarque : il n'existe plus ! :-(( (Traducteur)]
La nouvelle version de Delphi2.0 est livrée avec le document WININET.PAS Si votre copie ne le contient pas, alors celle ci-dessus.
World Wide Web Node peut vous le fournir. WININET.PAS comprend une liste de variables, fonctions, types et propriétés conçus pour étendre Microsoft Windows Internet. Cela signifie que vous pouvez facilement ajouter la prise en charge FTP, HTTP et Gopher à vos applications. WININET.DLL de Microsoft est distribué gratuitement S'il ne se trouve pas dans votre répertoire Windows/System ou Windows/System32, vous pouvez l'obtenir auprès de Microsoft. Voici le nœud World Wide Web où le fichier d'aide de la fenêtre WININET.H est disponible :
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Remarque : il semble qu'il ne soit plus disponible ! : -( (Traducteur)]
De manière générale, la maison en ligne des développeurs Internet Microsoft est la partie INTDEV du nœud Microsoft.
Outre WININET et ICP, une autre technologie clé prise en charge par Delphi est ISAP. Comme indiqué dans la documentation d'entreprise de Microsoft
Comme décrit, cette technologie vous permet « d'écrire » des scripts côté serveur et de filtrer des scripts, étendant ainsi Microsoft Internet Information Services et d'autres services Web ISAPI.
Si vous avez besoin de trouver une description d’ISAPI, vous pouvez accéder à :
http://www.microsoft.com/intdev/sdk/servapi.htm [Remarque : Que Dieu vous bénisse ! ;-) (Traducteur)]
A la fin de cet article, une copie du document clé ISAPI nommé HTTPEXT.PAS est jointe.
L'Internet Control Pack (ICP) publié gratuitement par Microsoft est un jeu de contrôles OCX/ActiveX que vous pouvez utiliser dans Delphi.
Faites-les glisser et déposez-les sur l'application (Delphi 2.0 inclut ces contrôles). Ils fournissent une assistance immédiate pour la création d'applications Delphi et savent comment naviguer sur le Web, utiliser FTP, WINSOCK et d'autres technologies Internet. Si votre copie de Delphi ne contient pas ces contrôles, vous devez ajouter ces documents au répertoire Lib dans le répertoire où se trouve Delphi avant de les utiliser. Les documents se trouvent sur le site INDEX.HTML de Borland au lien mentionné ci-dessus. Je n'ai pas mentionné les contrôles ICP dans cet article, mais toute personne intéressée par cette technologie doit absolument confirmer qu'elle en dispose.
Une copie du contrôle.
Vous pouvez télécharger mes fichiers d'application Pascal depuis mon site, leurs noms sont STRBOX.PAS et MATHBOX.PAS.
Il serait utile de consulter fréquemment ce site pour connaître les mises à jour des informations mentionnées dans cet article.
Ici, je suppose que le lecteur est familier avec Delphi et Object Pascal, et qu'il est familier avec Internet, HTML,
Avoir une compréhension de base des navigateurs et des serveurs World Wide Web.
ISAPI
ISAPI est une technologie simple à utiliser mais puissante qui vous permet d'étendre les capacités des services d'information Internet.
Cette technologie est livrée avec Windows NT 4.0 et permet de créer des sites WEB, FTP et GOPHER sur votre serveur. En même temps, cette technologie est compatible avec le serveur WindowsNT3.51 [Remarque : fait référence à la version serveur, l'autre version est la version poste de travail (traducteur)].
Dans le passé, la meilleure façon de faire évoluer un serveur Web consistait à créer des applications CGI. Ce sont des outils puissants, mais ils sont aussi
Limités par leur format d'exécution [Remarque : Par exemple, PERL est interprété et exécuté (traducteur)]. Lorsque vous effectuez une requête CGI au serveur à partir d'un navigateur, l'application CGI sera probablement d'abord forcée en mémoire, ce qui prendra beaucoup de temps. De plus, dans certaines circonstances, la technologie CGI apparaît un peu plus difficile à utiliser.
ISAPI est une méthode de remplacement des applications CGI en écrivant des DLL [Remarque : Dynamic Link Program (Traducteur)]. Vous pouvez également
Il est possible d'écrire du texte filtré via ISAPI, mais je ne mentionnerai pas cette technologie dans cet article. Comparé à CGI, ISAPI est plus facile à utiliser, plus rapide et permet une meilleure utilisation des ressources système. Dans les points suivants, j'expliquerai en détail pourquoi les DLL ISAPI sont meilleures que les applications CGI :
Les DLL ISAPI se trouvent à la même adresse que le service HTTP, elles peuvent donc accéder au service HTTP directement depuis le serveur. Par rapport aux applications CGI, elles peuvent se charger plus rapidement en mémoire ; lorsqu'elles effectuent une requête sur le serveur, elles nécessitent moins de temps de pause [Remarque : fait référence au temps entre l'exécution d'une requête et la réception d'une réponse du serveur (Traducteur)] Beaucoup. Ceci est encore plus important lorsque le serveur est soumis à une forte charge.
Vous pouvez contrôler le moment où les DLL sont chargées et déchargées. Par exemple : vous pouvez précharger les DLL à la première requête ;
Déchargez les DLL de l'application ISAPI lorsqu'elles ne sont pas utilisées pour libérer des ressources système.
Comme mentionné précédemment, vous pouvez utiliser ISAPI pour écrire du texte filtré [Remarque : fait généralement référence aux scripts dans la structure C/S (traducteur)], plus
Selon la documentation de Microsoft, vous pouvez filtrer le texte via ISAPI pour effectuer les opérations suivantes :
Schéma d'autorisation des utilisateurs
compression
cryptage
se connecter
Analyse du trafic ou autre analyse de requêtes (par exemple, recherche de requêtes dans "....etcpassWord")
Dans cet article, je me concentrerai sur la façon d'écrire des DLL qui renvoient des ensembles de données ou sur la manière d'interagir avec les utilisateurs exécutant des navigateurs.
Établissez un simple contact.
Notions de base sur ISAPI
Le fichier HTTPEXT.PAS contient des instructions clés pour l'utilisation d'ISAPI. Ce document doit accompagner le
Version Delphi distribuée. Il peut également être trouvé sur le site de Borland, joint à la section ISAPI de cet article. Comme cela est basé sur la technologie NT, vous devez utiliser Delphi 2.0 ou supérieur pour appliquer cette technologie. Vous ne pouvez pas l'utiliser sur un éditeur 16 bits.
HTTPEXT.PAS contient l'interface de la technologie ISAPI créée par Microsoft [Note : fait référence à l'interface Delphi, ISAPI est compilé en C++
écriture (traducteur)]. Lors de l'écriture de Delphi, aucune interface utilisateur ISAPI n'est fournie. Je décrirai uniquement comment utiliser la technologie existante de Microsoft. Cependant, ISAPI est trop simple à utiliser et pour la plupart des utilisateurs, la version utilisateur de l'objet Delphi n'est pas nécessaire.
Trois fonctions peuvent être utilisées comme entrées dans les DLL ISAPI. Les deux premières sont obligatoires et la troisième est facultative.
GetExtensionVersion : Vérifiez la version minimale
HttpExtensionPRoc : C'est le point d'entrée de la DLL, tout comme le bloc start...end dans une application Delphi
TerminateExtension : il s'agit d'un programme facultatif qui peut être utilisé comme thread pour nettoyer d'autres allocations de mémoire.
Lorsque vous créez une DLL ISAPI, vous devez référencer les deux premières des trois fonctions répertoriées ci-dessus, exécutez ceci
Deux fonctions sont la clé de toute programmation ISAPI.
Les trois instructions contiennent une « sortie de mots », un terme utilisé parce que les DLL ISAPI étendent les services Internet (IIS).
appareil. (N'oubliez pas qu'Internet Information Server fait référence à Microsoft Server. Si vous souhaitez utiliser un serveur NT comme serveur Web physique, alors c'est exactement l'outil dont vous avez besoin. Les DLL ISAPI sont distribuées avec NT4.0 et sont installées lors de l'installation du système d'exploitation. . est installé automatiquement.)
ISAPI fournit une norme que les serveurs de production peuvent suivre. Par exemple, il peut s'agir de l'interface complexe NSAPI de Netscape
Compressé dans l'ISAPI concis et beau pertinent pour faire fonctionner l'interface NSAPI.
Ce qui suit est la déclaration de ces deux fonctions importantes
fonction GetExtensionVersion (var Ver : THSE_VERSION_INFO) : BOOL stdcall ;
fonction HttpExtensionProc(var ECB : TExtensionControlBlock) : DWORD ;
Il vous suffit de coller GetExtensionVersion dans vos DLL et vous avez terminé. Vous n'avez qu'à apporter des modifications mineures lorsque ISAPI publie de nouvelles versions au public.
fonction GetExtensionVersion (var Ver: THSE_VERSION_INFO) :
BOOL ; appel standard ;
commencer
Ver.dwExtensionVersion := 00010000 $ ; // prise en charge 1.0
Ver.lpszExtensionDesc := 'DLL ISAPI Delphi 2.0';
Résultat := Vrai ;
fin;
Le paramètre passé à cette fonction est déclaré dans HTTPEXT.PAS comme suit :
Les paramètres concernés sont déclarés dans HTTPEXT.PAS comme suit :
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = enregistrement compressé
dwExtensionVersion : DWORD ;
lpszExtensionDesc : tableau[0..HseMaxExtDLLNameLen-1] de Char ;
fin;
La constante HseMaxExtDllNameLen a une valeur de 256 dans la déclaration. Les deux variables de l'enregistrement sont "auto-déclarées". La première contient le numéro de version ISAPI [Remarque : la variable dwExtensionVersion (Traducteur)] et la seconde représente une chaîne définie par l'utilisateur utilisée pour décrire les DLL.
Lorsque vous faites référence à l'instruction GetExtensionVersion, vous devez ajouter une entrée à la section du fichier DPR de votre programme DLL.
partie. Pendant que vous rédigez cette déclaration, vous devez également écrire :
exportations
ObtenirExtensionVersion
HttpExtensionProc ;
C'est ce que vous faites lors de la configuration des fonctions pour ces deux DLL ISAPI importantes. L'étape suivante, utiliser HttpExtensionProc, est un peu plus compliquée, je vais donc la laisser dans une section distincte.
Travailler avec HttpExtensionProc
L'instruction HttpExtensionProc est le point d'entrée de la DLL. Sa fonction est comme l'instruction main() en langage C, ou
La partie début...fin dans Delphi
Voici un exemple simple utilisant l'instruction GetExtensionVersion
fonction HttpExtensionProc(var ECB : TExtensionControlBlock) :
DWORD ; appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := ' +
'
'Bonjour de l'ISAPI
' +
';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Type de contenu : texte/html'#13#10+
'Longueur du contenu : %d'#13#10+
'Contenu :'#13#10#13#10'%s'
[Longueur(ResStr)
ResStr]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
Si vous faites une requête à cette DLL lors de la navigation, vous obtiendrez une réponse comme celle-ci :
Résultats du serveur de test
Bonjour de l'ISAPI
La plupart des champs du corps de la fonction sont étroitement liés au simple code HTML qui fournit des informations de base. Vous devez également remplir certains champs du TExtensionControlBlock comme indiqué ci-dessous.
Notez qu'il existe un pointeur de fonction appelé WriteClient dans cet enregistrement. Vous pouvez vous référer à cette fonction pour transmettre des informations.
Renvoyez au navigateur. Lors de l'appel de cette fonction, vous utilisez le champ ConnID dans le bloc TExtensionControl mentionné ci-dessous. Lorsque la fonction est appelée, le ConnID est automatiquement renseigné pour vous.
Avant de regarder le code de la fonction, laissez-moi vous démontrer toutes les fonctions HttpExtensionProc mentionnées ci-dessus
Programme complet de DLL ISAPI
bibliothèque Isapi1 ;
bibliothèque Isapi1 ;
utilise
Fenêtres
SysUtils
HTTPExt ;
fonction GetExtensionVersion (var Ver: THSE_VERSION_INFO ): BOOL stdcall ;
commencer
Ver.dwExtensionVersion := $00010000; // Nous attendons le support de la version 1.0
Ver.lpszExtensionDesc := 'Écrit en Delphi 2.0';
Résultat := Vrai ;
fin;
fonction HttpExtensionProc( var ECB : TEXTENSION_CONTROL_BLOCK ) : DWORD ;
appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := '
' +
'
Résultats du serveur de test
' +
'
Isapi dit bonjour à DevRel
';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Type de contenu : texte/html'#13#10+
'Longueur du contenu : %d'#13#10+
'Contenu :'#13#10#13#10'%s'
[Longueur(ResStr)
ResStr]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
exportations
ObtenirExtensionVersion
HttpExtensionProc ;
commencer
fin.
Afin d'exécuter ce programme DLL, vous devez le copier dans le répertoire des scripts sous votre serveur NT. Sur ma machine NT4.0
Cela se passe comme ceci :
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
Dans cet exemple, j'ai créé mon répertoire appelé "mystuff"
C'est juste utilisé pour stocker ce que j'ai créé
DLL ISAPI. Bien entendu, votre répertoire ne sera pas exactement le même que sur ma machine, en fonction de l'emplacement de votre répertoire "inetsrv" et d'autres facteurs.
Pour appeler avec succès cette DLL, vous devez ajouter ce lien hypertexte à votre page HTML :
ISAPI Un
Lorsque l'utilisateur clique sur cet hyperlien, la DLL ISAPI1 sera appelée, puis la chaîne "Bonjour d'ISAPI" sera affichée
affiché sur le navigateur de l'utilisateur. Si vous ne placez pas ISAPI.DLL dans le répertoire mystuff, alors vous devez modifier le code HTML ci-dessus pour l'adapter à votre situation. Notez que votre répertoire doit être relatif au répertoire inetsrv et ne doit pas et ne peut pas contenir le répertoire dans lequel se trouve l'intégralité de votre DLL.
Voici le script HTML complet de l'appel :
Ceci est la page d'accueil de mon ordinateur personnel.
ISAPI Un
Notez que si vous copiez plusieurs fois le programme ISAPI1.DLL dans le répertoire mystuff, vous devez
Fermez le port World Wide Web du serveur Web. En effet, la première fois que vous copiez cette DLL, vous êtes libre de toute restriction, mais après cela, elle appartient au serveur. Par conséquent, lorsque vous copiez la version mise à jour de la première copie, vous devez désactiver le service World Wide Web. Vous pouvez utiliser un programme de gestion de réseau pour désactiver le service World Wide Web. Ce programme doit appartenir au groupe Microsoft Internet Server et être installé sous l'Explorateur/Gestionnaire de programmes lors de l'installation des Network Information Services.
Fonctionne avec TExtensionControlBlock
Avec ce point de cet article, vous pourrez créer votre première DLL ISAPI et l'exécuter en ligne sur une deuxième machine.
Le navigateur Web l'appelle.
Le reste d'ISAPI sera plus détaillé dans cet article.
Voici la partie la plus compliquée des paramètres HttpExtensionProc
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = enregistrement compressé
cbTaille : DWORD ; // = taille de (TExtensionControlBlock)
dwVersion : DWORD ; // informations de version de cette spécification
ConnID : HCONN ; // Contexte Ne pas modifier !
dwHttpStatusCode : DWORD ; // Code d'état HTTP
// Informations de journal terminées par null spécifiques à cette DLL d'extension
lpszLogData : tableau [0..HSE_LOG_BUFFER_LEN-1] de Char ;
lpszMethod : PChar ; // REQUEST_METHOD
lpszQueryString : PChar ; // QUERY_STRING
lpszPathInfo : PChar ; // PATH_INFO
lpszPathTranslated : PChar ; // PATH_TRANSLATED
cbTotalBytes : DWORD ; // Nombre total d'octets du client
cbAvailable : DWORD ; // Nombre d'octets disponibles
lpbData : Pointeur ; // pointeur vers les octets cbAvailable
lpszContentType : PChar ; // Type de contenu des données client
GetServerVariable : TGetServerVariableProc ;
WriteClient : TWriteClientProc ;
ReadClient : TReadClientProc ;
ServerSupportFunction : TServerSupportFunctionProc ;
fin;
Notez que cet enregistrement contient le champ ConnID mentionné ci-dessus et transmet le premier paramètre à WriteClient.
Le premier paramètre de cet enregistrement concerne le contrôle de version. Il doit s'agir de la taille du TExtensionControlBlock spécifié. Si Microsoft modifie sa structure, il peut déterminer à quelle version de la structure il s'agit en vérifiant la taille de l'enregistrement. Vous ne voulez jamais les trois premiers champs de cet enregistrement, ils ont déjà été renseignés par ISAPI et ils ne sont accessibles que dans votre programme, et non modifiés.
Le champ le plus important de cet enregistrement est probablement lpszQueryString, qui contient la requête du serveur.
information. Par exemple, supposons que vous ayez créé un fichier appelé ISAPI1.Dll. Afin d'appeler cette DLL, vous créez un HREF comme celui-ci [Note : un format en langage HTML (traducteur)] sur une page de votre navigateur :
Testez un
Si vous souhaitez répondre à cette DLL, vous devez modifier la ligne ci-dessus comme ceci :
Testez un
Si l'extrait de code HTML contient quelque chose comme la deuxième des deux lignes ci-dessus, alors votre DLL aura le paramètre lpszQueryString.
Obtenez la chaîne de "MyQuery", portez une attention particulière à l'utilisation de l'indicateur de requête suivant la chaîne de requête.
Bien sûr, vous pouvez modifier la chaîne de requête comme bon vous semble. Par exemple, vous pouvez écrire :
Testez un
Dans cette requête, cette DLL répondra avec le nom du serveur. Vous n'êtes soumis à aucune restriction lors du passage de ce paramètre. toi
Vous pouvez transmettre ce que vous voulez, et c'est à vous de décider comment vous souhaitez analyser les informations contenues dans la DLL.
Lorsque vous renvoyez des informations du serveur vers le navigateur, vous utilisez le pointeur de fonction "WriteClient" dans cet enregistrement
. Vous n'avez rien à faire lors de l'initialisation de ce pointeur ; il vous est automatiquement transmis par le serveur d'informations réseau.
Les auteurs d'applications CGI remarqueront que la syntaxe de transmission des chaînes de requête est très familière. En fait, ISAPI a suivi CGI
Comme pour la plupart des conventions, la plupart des champs de TExtensionControlBlock peuvent simplement être empruntés par la technologie CGI.
Un autre champ clé de TExtensionControlBlock est lpbData, qui contient des informations supplémentaires téléchargées lors de la navigation.
Par exemple, si vous disposez d'un formulaire HTML comportant plusieurs champs, les informations contenues dans ces champs s'appelleront "
lpData". La rubrique suivante de cet article, "Obtention d'informations à partir du bouton 'OK'", se concentrera sur la façon de gérer cette situation.
Jusqu'à présent, j'ai présenté les quatre champs clés dans TExtensionControlBlock :
WriteClient : un pointeur qui vous permet de transmettre des données HTML formatées au navigateur. Cette fonction est utilisée
Champ ConnID de TExtensionControlBlock.
lpszQueryString : la requête provenant du navigateur.
lpbData : données supplémentaires téléchargées depuis le navigateur. Habituellement, le contenu de n'importe quel champ d'un formulaire HTML
. J'en discuterai plus en détail dans la section « Bouton de confirmation ».
Pour avoir une idée du fonctionnement des autres champs de TExtensionControlBlock, le meilleur moyen est de
Parcourez-les et comparez-les. En d'autres termes, vous souhaiterez créer une page HTML permettant à l'utilisateur d'appeler la DLL ISAPI du client. Le but de cette DLL ISAPI est simplement de formater chaque champ du TExtensionControlBlock en HTML, puis de les renvoyer au navigateur. Cela transforme votre navigateur en un débogueur quelque peu effrayant qui affiche tous les champs du TExtensionControlBlock.
Voici un programme, écrit par Danny Thorpe de Borland, qui effectue cette tâche :
test de bibliothèque1 ;
utilise
Fenêtres
SysUtils
HTTPExt ;
fonction GetExtensionVersion (var Ver: THSE_VERSION_INFO ): BOOL stdcall ;
commencer
Ver.dwExtensionVersion := 00010000 $ ; // prise en charge 1.0
Ver.lpszExtensionDesc := 'Une DLL de test écrite en Delphi 2.0';
Résultat := Vrai ;
fin;
fonction HttpExtensionProc( var ECB : TEXTENSION_CONTROL_BLOCK ) :
DWORD ; appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
Buf : tableau [0..1024] de Char ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := Format(
' +
'
'Taille = %d
'+
'Version = %.8x
'+
'IDConn = %.8x
'+
'Méthode = %s
' +
'Requête = %s
' +
'CheminInfo = %s
'+
'CheminTraduit = %s
'+
'TotalOctets = %d
'+
'Octets disponibles = %d
'+
'Type de contenu = %s
'+
'
[BCE.cbSize
ECB.dwVersion
ECB.ConnID
ECB.lpszMethod
BCE.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathTraduit
BCE.cbTotalBytes
ECB.cbDisponible
ECB.lpszContentType]);
avec la BCE faire
commencer
StrLen := Taillede(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
'SERVEUR_NAME'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVEUR_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVEUR_PROTOCOLE'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVEUR_LOGICIEL'
@Buf
StrLen);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'ID de fil = %.8x
'
[ResStr
Buf
GetCurrentThreadID]);
fin;
ResStr := ResStr + ';
ResStr := Format(
'HTTP/1.0 200 OK'#13#10+
'Type de contenu : texte/html'#13#10+
'Longueur du contenu : %d'#13#10+
'Contenu :'#13#10#13#10'%s'
[Longueur(ResStr)
ResStr]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
exportations
ObtenirExtensionVersion
HttpExtensionProc ;
commencer
fin.
Afin d'appeler cette DLL, vous devez créer un script HRML qui inclut la ligne suivante
Testez un
Obtenir des informations à partir du bouton "Confirmer"
Habituellement, les formulaires HTML qui vous envoient des informations comportent un bouton de confirmation. Tant que la quantité d'informations est inférieure à 49 Ko, vous pouvez
Considérez que le champ lpbData dans TExetensionControlBlock est disponible. Voici comment vous pouvez
Dans la plupart des cas, les informations envoyées par le pointeur vers ce champ sont obtenues :
var
S : chaîne ;
commencer
…
S := PChar(ECB.lpbData);
…
fin;
Si les informations provenant de ce champ dépassent 48 Ko, vous devez alors appeler ReadClient pour obtenir les informations restantes.
Si vous souhaitez savoir exactement quelles informations sont disponibles dans le champ lpbData, vous pouvez utiliser les deux fonctions suivantes pour renvoyer les données à votre navigateur Web :
fonction SetUpResString : chaîne ;
commencer
Résultat := ' +
' +
'
'lpbDonnées = %s ' +
';
fin;
fonction HttpExtensionProc(var ECB : TExtensionControlBlock) :
DWORD ; appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
S
S1 : chaîne ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
Supposons que vous disposez déjà d’un formulaire HTML avec le code suivant en pièce jointe :
Ce code produira un formulaire avec une zone de texte pour que vous puissiez saisir des chiffres et un bouton « soumettre » appelé « GetSquare ». Si vous disposez de ce formulaire, vous pouvez vous attendre à ce que les deux programmes ci-dessus renvoient la chaîne suivante, en supposant que l'utilisateur entre le nombre 23 dans la zone de texte du formulaire :
lpbData = GetSquare=23&GetSquare=Soumettre
Afin de comprendre ce qui se passe en ce moment, faites attention à la partie principale de l'instruction HTML extraite de la fonction ci-dessus. Cette partie de l'instruction réside sur le serveur et se reflète comme suit :
'lpbDonnées = %s ' +
Si vous étudiez le code de la fonction HttpExtensionProc ci-dessus, vous constaterez que juste avant cette phrase, elle utilise le paramètre %s dans l'instruction Format au lieu de la valeur dans ECB.lpbData. (Si vous ne savez pas comment fonctionne l'instruction Format, veuillez vous référer à la documentation Delphi appropriée) [Remarque : dans l'encyclopédie de programmation Delphi2 de l'auteur (Delphi2
Il y a des instructions détaillées dans le chapitre 3 "Chaînes et fichiers texte" dans Unleashed (Traducteur)]
Supposons que dans le formulaire ci-dessus, lorsque l'utilisateur appuie sur le bouton "Confirmer", la valeur transmise par lpbData à la DLL ISAPI est :
GetSquare=23&GetSquare=Soumettre
Pour vous donner une idée claire, permettez-moi de répéter que l'information renvoyée au navigateur par les deux instructions ci-dessus est la chaîne suivante, que vous avez déjà vue :
lpbData = GetSquare=23&GetSquare=Soumettre
La meilleure façon de voir ce processus est de tester l’exécution du programme ISAPI2 répertorié ci-dessous. ISAPI2 est similaire à ISAPI1, mais il inclut la nouvelle fonction HttpExtensionProc présentée ci-dessus, ainsi que la fonction utilitaire SetUpResString.
bibliothèque Isapi2 ;
utilise
Fenêtres
SysUtils
HTTPExt ;
fonction GetExtensionVersion (var Ver: THSE_VERSION_INFO) :
BOOL ; appel standard ;
commencer
Ver.dwExtensionVersion := 00010000 $ ; // prise en charge 1.0
Ver.lpszExtensionDesc := 'DLL écrite en Delphi 2.0';
Résultat := Vrai ;
fin;
fonction SetUpResString : chaîne ;
commencer
Résultat := ' +
' +
'
'lpbDonnées = %s ' +
';
fin;
fonction HttpExtensionProc( var ECB : TEXTENSION_CONTROL_BLOCK ) :
DWORD ; appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
S
S1 : chaîne ;
Len : entier ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
exportations
ObtenirExtensionVersion
HttpExtensionProc ;
commencer
fin.
Une fois que vous avez obtenu les informations transmises par la variable lpbData depuis le formulaire, vous pouvez analyser les informations ou les renvoyer à l'utilisateur. Par exemple, vous pouvez extraire le nombre 23 de l'exemple ci-dessus, le mettre au carré et le renvoyer à l'utilisateur. Cela vous permet d'obtenir des informations de l'utilisateur, dans ce cas des nombres, d'effectuer des opérations mathématiques sur les nombres et enfin de renvoyer le résultat à l'utilisateur. Cela signifie que vous pouvez créer des pages Web interactives directement sur les ondes, ce qui constitue actuellement l'aspect le plus populaire de la programmation Internet !
Ce qui suit est un code de programme complet qui soumet le carré d'un nombre au navigateur sur le réseau :
bibliothèque Isapi3 ;
{ Ce code montre comment recueillir les commentaires de l'utilisateur via un navigateur
analyser ces informations
puis renvoie une réponse à l'utilisateur notamment.
l'utilisateur soumet un numéro
ce code le met au carré
puis renvoie le résultat à l'utilisateur. Voici le formulaire du navigateur qui soumet les informations pour analyse :
}
utilise
Fenêtres
SysUtils
HTTPExt
StrBox ;
fonction GetExtensionVersion (var Ver: THSE_VERSION_INFO) :
BOOL ; appel standard ;
commencer
Ver.dwExtensionVersion := $00010000; // prise en charge de la version 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Résultat := Vrai ;
fin;
// Analyse lpbData et récupère le numéro que l'utilisateur nous a transmis.
fonction ParseData(S: chaîne) : Entier ;
commencer
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Résultat := StrToInt(S);
fin;
fonction SetUpResString : chaîne ;
commencer
Résultat := ' +
' +
'
'Réponse = %d ' +
';
fin;
fonction HttpExtensionProc( var ECB : TEXTENSION_CONTROL_BLOCK ) :
DWORD ; appel standard ;
var
ResStr : chaîne ;
StrLen : entier ;
S
S1 : chaîne ;
Nombre : entier ;
commencer
ECB.lpszLogData := 'Journal DLL Delphi';
ECB.dwHTTPStatusCode := 200 ;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Numéro := ParseData(S);
Num := Carré(Num);
ResStr := Format(ResStr
[Nombre]);
StrLen := Longueur(ResStr);
ECB.WriteClient(ECB.ConnID
Pointeur (ResStr)
StrLen
0);
Résultat := HSE_STATUS_SUCCESS ;
fin;
exportations
ObtenirExtensionVersion
HttpExtensionProc ;
commencer
fin.
Ce code accepte la chaîne suivante de l'utilisateur qui a appuyé sur le bouton de confirmation et demandé le nombre au carré :
GetSquare=5&GetSquare=Soumettre
En supposant une entrée comme celle-ci, ce code renverra la chaîne suivante à l'utilisateur via Internet :
Réponse = 25
En une phrase, l'utilisateur saisit le chiffre 5 et vous lui renvoyez le chiffre 25. Si l'utilisateur soumet le nombre 10, alors vous renvoyez le nombre 100. Cela peut paraître anodin, mais ce qui compte ici, c'est ce qui se passe sur Internet.
OMS)]
Analysez la fonction passée par l'utilisateur comme ceci :
// Analyse lpbData et récupère le numéro que l'utilisateur nous a transmis.
fonction ParseData(S: chaîne) : Entier ;
commencer
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Résultat := StrToInt(S);
fin;
Ces deux déclarations sont dans l'unité mentionnée au début de cet article et sont également incluses sur mon site. [Remarque : ce document peut être trouvé presque partout sur Internet
Vous pouvez également le demander au traducteur (Traducteur)][Dans cet article
Je veux juste tellement parler d'ISAPI. Cela devrait suffire à vous inciter à vous amuser en profitant de cette formidable technologie. Ensuite, je veux parler des deux déclarations GetServerVariable et ReadClient. Je n'ai mené que des expériences extrêmement limitées à cet égard. Dans cet article, j'ai joint le fichier HTTPEXT.PAS car vous ne le trouverez nulle part ailleurs que dans ce document critique.
Instructions GetServerVariable et ReadClient
Tout comme pour demander des informations dans votre application CGI, vous pouvez utiliser des instructions pour obtenir des informations du serveur. Voici un exemple d'appel de cette instruction :
Len := HseMaxExtDllNameLen;
Définir la longueur (S1
Len);
décembre(Len);
ECB.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
Len);
Tout d’abord, ce code définit la longueur du tampon contenant les informations récupérées du serveur. Il appelle ensuite le serveur et fait une requête, dans ce cas, il demande le "CONTENT_LENGTH" du message au serveur.
La documentation Microsoft nous indique que vous pouvez passer la chaîne suivante comme deuxième paramètre de GetServerVariable :
AUTH_TYPE Il contient le type d'autorisation utilisé. Par exemple, si vous utilisez une autorisation de base, alors
La chaîne est « de base » ; s’il s’agit d’une réponse à un défi NT, la chaîne est « NTLM ». D'autres autorisations ont des chaînes correspondantes spécifiques. Étant donné que de nouveaux types d'autorisation sont constamment ajoutés au serveur, il n'est pas possible de répertorier toutes les chaînes possibles. Si la chaîne est vide, aucune autorisation n'est utilisée.
CONTENT_LENGTH Le nombre d'octets que le script s'attend à récupérer auprès du client.
CONTENT_TYPE Le type de contenu des informations fournies par le corps de l'annonce de la demande. [Remarque : le frère cadet est moins talentueux et moins bien informé, un
La requête POST est temporairement traduite par "avis de demande", veuillez me corriger (traducteur)]
PATH_INFO Informations de routage supplémentaires, fournies par le client. Il contient le chemin d'accès à l'URL suivant le nom du script
Dépendre de. S'il est présent, il précède la chaîne de demande.
Path_translated Il s'agit de la valeur de Path_info mais contient les noms de tous les routes virtuelles étendues à un drapeau de chemin.
Query_string les informations suivant le "?" Dans l'URL qui fait référence à ce script.
Remote_addr L'adresse IP du client demandeur ou de son agent (par exemple, une passerelle ou un pare-feu).
Remote_host le nom d'hôte du client demandeur ou de son agent (par exemple, une passerelle ou un pare-feu).
Remote_User Ceci contient le nom d'utilisateur fourni par le client et autorisé par le serveur. Si une chaîne vide est renvoyée, l'utilisateur
en votre nom (mais avec autorisation).
Unmapt_Remote_User C'est le nom d'un utilisateur avec les caractéristiques suivantes: Cet utilisateur fait une demande au compte d'utilisateur NT (c'est son identité), avant lequel le filtre d'application ISAPI a cartographié l'utilisateur.
Request_method est la méthode de demande HTTP.
Script_name le nom du script exécuté.
Server_name le nom d'hôte ou l'adresse IP lorsqu'il apparaît dans les URL auto-référentiels.
Server_port le port TCP / IP qui accepte les demandes.
Server_port_secure une chaîne qui est 0 ou 1. Il est 1 lorsque la demande est traitée par un port sécurisé; 0 autrement.
Server_protocol accepte le nom et la version des informations de protocole associées à cette demande. Il s'agit généralement de HTTP / 1.0.
Server_software est le nom et la version du serveur Web où le programme DLL de l'application ISAPI s'exécute. All_http La variable précédente n'a pas analysé tous les en-têtes HTTP. Ces variables sont dérivées de HTTP_ <Nom de l'en-tête de champ>. Les en-têtes de champ (séparés par les marqueurs de ligne) contiennent des chaînes individuelles, qui ne sont pas terminées.
HTTP_ACcept Cas spécial de l'en-tête de champ HTTP. Les valeurs acceptées sont: les champs séparés par des virgules (,). Par exemple: si
Les lignes suivantes font partie de l'en-tête HTTP:
Accepter: * / *, q = 0,1
Ensuite, l'URL (une nouvelle fonctionnalité de la version 2.0) donne sa pièce de base.
Notez que l'article d'information ci-dessus est automatiquement passé par l'enregistrement TextensionControlBlock. parce que
Vous n'avez pas besoin d'appeler GetServervariable pour cela. Cependant, vous pouvez l'appeler si vous en avez vraiment besoin, surtout si vous souhaitez obtenir des informations de ReadClient et que vous devez savoir combien d'informations à lire.
Plusieurs fois, vous n'avez pas besoin d'appeler ReadClient. Cependant, la taille du message envoyé par votre navigateur est supérieure à 48 Ko
Le temps, vous devez appeler ReadClient pour obtenir le reste des informations.