Home » Tutorials » Netzwerk und Internet » ISAPI

ISAPI

Zum Eigentlichen

Prinzip der Extension wird sein, dass sie einen POST annimmt, und entsprechend der Eingabe etwas zurückgibt. Die Eingabe, das sind in diesem Falle die Parameter, die an die DLL gereicht werden. Der Parameter mit dem Namen „file“ und der Parameter „savetofile“ (beide werden im übergebenen Formular als „hidden“ deklariert) haben hierbei besondere Bedeutung, auf die später näher eingegangen wird.
lstrcmpi() gibt bei Übereinstimmung der übergebenen Strings (das „i“ steht für case-insensitive, also Klein/Großschreibung nicht beachtend – Gegenpart ist lstrcmp) 0 (null) zurück oder eben einen entsprechenden anderen Wert, je nach Relation zwischen den Strings (siehe PSDK oder Win32.HLP).

case lstrcmpi(pECB.lpszMethod, 'POST') of
   0: begin
        filetoshow := GetParam('file', allparam);
        case filetoshow = '' of
          true: page := GetErrorPage(3);
          false:
            if fileexists(filetoshow) then begin
              page := GetFileInString(filetoshow);
              param := Getparam('savetofile', allparam);
              if param <> '' then begin
                GetLocalTime(st);
                datum := frmt('[%u-%u-%u]', [pointer(st.wDay),
                pointer(st.wMonth), pointer(st.wYear)]);
                temp := '';
                if fileexists(param) then temp := GetFileInString(param);
                temp := temp + #13#10#13#10 +
                '------------------------------------------' +
                #13#10 + 'Record from ' + datum;
                for i := 0 to length(allparam) - 1 do begin
                  temp := temp + #13#10 + spaceout(allparam[i].name) +
                  ' = ' + spaceout(allparam[i].value);
                end;
                hFileWrite := CreateFile(@param[1], GENERIC_READ or
                GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0);
                pc := @temp[1];
                WriteFile(hFileWrite, pc^, length(temp), SizeWritten, nil);
                CloseHandle(hFileWrite);
            end;
          end
          else page := GetErrorPage(2);
        end;
      end;
   else page := GetErrorPage(20);
end;

In dieser case-Schleife überprüfen wir also, ob es sich um einen POST handelt. Wenn ja, dann weitere Bearbeitung, wenn nein, dann Fehlerausgabe.
allparam ist als folgender Typ deklariert:

type
  ATIStrings = array of record
    name,
      value: string;
  end;

und wurde vorher aus dem übergebenen String extrahiert. Dazu benutzen wir die oben bereits genannte Funktion GetAllParams(), die EscapeToAscii() schon integriert.
Nachdem wir alle Parameter haben, lesen wir erstmal „file“ aus. Wenn es die Variable gibt und sie einen sinnvollen Wert enthält (Datei existiert etc.), dann wird die Seite schon mal in den Rückgabewert (hier page) eingelesen. Dazu bedienen wir uns FileMapping in der programminternen Routine GetFileInString(). Falls dies von Interesse ist, bitte die entsprechende Win32-API-Dokumentation zu den einzelnen Funktionen befragen 😉
Die Variable „savetofile“, insofern vorhanden, enthält jetzt ganz simpel den Namen und vollen lokalen Pfad der Datei, in der die Formulardaten gesichert werden sollen. Dementsprechend lesen wir die Datei aus und hängen die neuen Daten an. Schema ist dabei Name_der_Variablen = Wert_der_Variablen. Das Datum wird mit integriert und fertig. In allen anderen Fällen wird ein Fehler zurückgegeben.