IIS : Les DLL d'extension ISAPI


IIS peut contenir des pages HTML, des images (GIF, JPEG ...) mais aussi exécuter des DLL. Depuis une page HTML, il est possible d'invoquer une fonction et de lui passer des paramètres. Une DLL peut contenir plusieurs fonctions dont une par défaut. Chaque paramètre de fonction est nommé et typé et peut comporter une valeur par défaut.
Voici une séquence d'appel à une DLL dans le cadre d'un formulaire:
<HTML>
<HEAD>
<SCRIPT Language="VBScript">
Sub Cnx_OnClick
	Dim CnxName, CnxPwd
	CnxName = Form1.CnxName.Value
	CnxPwd = Form1.CnxPwd.Value
	window.Navigate("scripts/LogonUser.dll?IdentifyUser?Name=" & CnxName & "&Pwd=" & CnxPwd)
End Sub
</SCRIPT>
</HEAD>

<FORM NAME="Form1" METHOD=POST>
	Connexion au système:<br><br>
	nom de connexion:<br><INPUT NAME="CnxName"><br>
	mot de passe:<br><INPUT NAME="CnxPwd"><br><br>
	<INPUT NAME="Cnx" TYPE=BUTTON VALUE="Connexion">
</FORM>
</HTML>
Le bouton Connexion provoque le chargement par IIS de LogonUser.DLL et appelle la fonction "IdentifyUser". L'appel à la fonction respecte la syntaxe suivante:
LogonUser.dll?IdentifyUser?Name=...&Pwd=...
La réalisation d'une DLL ISAPI est grandement simplifiée en utilisant la librairie de classes MFC. La description des fonctions est réalisée dans une map.
BEGIN_PARSE_MAP(CLogonUserExtension, CHttpServer)
	ON_PARSE_COMMAND(IdentifyUser, CLogonUserExtension, ITS_PSTR ITS_PSTR)
	ON_PARSE_COMMAND_PARAMS("Name Pwd")
END_PARSE_MAP(CLogonUserExtension)
Chaque fonction est incorporée dans une classe dérivée de CHttpServer. Lorsque le serveur reçoit une requête d'un client, il créé un objet CHttpServer et lui associe un objet CHttpServerContext pour la fonction demandée. Chaque fonction doit faire appel à StartContent et EndContent afin de générer le flux HTML destiné au client. Entre ces deux fonctions, on utilise l'opérateur << de l'objet contexte pour y insérer ses propres données.
void CLogonUserExtension::IdentifyUser(CHttpServerContext* pCtxt, LPTSTR lpszName, LPSTR lpszPwd)
{
	StartContent(pCtxt);
	WriteTitle(pCtxt);
	*pCtxt << "Logon " << lpszName << " " << lpszPwd << " OK";
	EndContent(pCtxt);
}
© 2001 Christophe Pichaud. All rights reserved.