[ zurück ]

Trouble-Shooting zum WinCGI-Artikel im PC-Magazin DOS 10/97, Seite 224 ff und zum Artikel im Delphi-Special, Heft 6/98, Seite 28ff


Mein Projekt im PC-Magazin 10/97 und im Delphi-Special 6/98 wurde unter Delphi 1 erstellt und getestet. Auch die Freewarekomponente von M.B. Klein stammmt aus seeligen Zeiten. Delphi 1 - Programmierer sollten eigentlich keine Schwierigkeiten haben. Unter Delphi 2/3 gibt es einige Probleme, die insgesamt 7 Fehlermeldungen produzieren. Im Artikel war aber kein Platz, diese Randprobleme zu erklären. Ausserdem darf ich ja die Freewarekomponente nicht verändern. Die Abhilfe ist recht einfach.

Problemübersicht:

Alternatives Projekt zur Windows-CGI-Lösung


(1) M.B.Klein verwendet in der Unit CGI.PAS folgendes:
   FStdOut.Write(Text[1], Byte(Text[0]));           (1x)
   StdOutFile.Write(Text[1], Byte(Text[0]));        (5x)

Delphi 2/3 meckert: "Auf Element 0 kann nicht zugegriffen werden!" Die Korrektur lautet:
   FStdOut.Write(Text[1], Byte(Length(Text)));      bzw.
   StdOutFile.Write(Text[1], Byte(Length(Text)));

Damit ist die Komponente CGI sauber an Delphi 2/3 angepaßt.


Wer die von M.B.Klein compilierte 16-bit DCU-Datei unter Delphi 2/3 benutzt, bekommt eventuell Probleme. Deshalb das Projekt wenigstens einmal mit: "Project - Build All" übersetzen, wobei der Quelltext von CGI.PAS und TUPLES.PAS im Bibliothekspfad liegen muß. Vorher zur Sicherheit eventuell die Dateien CGI.DCU und TUPLES.DCU löschen. Dann tritt zwar Problem (1) auf, aber das ist wie oben beschrieben leicht zu lösen.
(2) Meine Routine "GetContentData" hat auch eine von Delphi 2/3 nicht akzeptierte Stelle. Es wird bemeckert, daß ich die Schleifenvariable i innerhalb der for-to-Schleife manipuliere. Macht man denn so was ? ;-)
Also statt dessen eine while-Schleife verwenden, wie folgende Korrektur es zeigt:
procedure GetContentData(var Liste: TStringList); {neue Version fuer Delphi2}
var pCont: PChar; ContStream: TFileStream; sPair: String; i: Integer;
begin
 GetMem(pCont,CGI1.Profile.ContentLength);
 ContStream:=TFileStream.Create(CGI1.Profile.ContentFile,fmOpenRead);
 ContStream.Read(pCont^,CGI1.Profile.ContentLength);
 ContStream.Free;
 i:=0;
 sPair:='';
 while i<CGI1.Profile.ContentLength do begin
  case (pCont+i)^ of     {Sonderzeichen behandeln}
   '+': sPair:=sPair+' ';
   '%': begin
         sPair:=sPair+Chr(16*HxToInt((pCont+i+1)^)+HxToInt((pCont+i+2)^));
         Inc(i,2);
        end;
   '&': begin Liste.Add(sPair); sPair:='' end;
   else sPair:=sPair+(pCont+i)^;
  end;
  Inc(i,1);
 end;
 Liste.Add(sPair);
 FreeMem(pCont,CGI1.Profile.ContentLength);
end;

(3a) Ein Nachnutzer des Projektes informierte mich über folgende Fehlermeldung beim Testen des Scripts:
 Anwendungsfehler
 Exception EDatabase Error in Modul CGITELBU.EXE bei 0001.3183
 Bei der Initialisierung der Borland DataBase Engine ist ein Fehler aufgetreten
 (Fehler $2108)

Nach intensivem Suchen hat sich folgendes ergeben:

In der Unit CGI und der Unit TUPLES der Freewarekomponente von M.B.Klein steht jeweils im Interface-Teil:
   uses Classes, DBTables, Forms,....

Damit wird die Borland-Database initialisiert, obgleich das für das Projekt nicht notwendig ist. Und wenn jemand die BDE gar nicht installiert hat, gibt's natürlich den genannten Fehler.

Die Lösung ist wieder einfach:

Entfernen Sie einfach den "DBTables"-Eintrag in der USES-Anweisung beider Units. Sie sind für mein Vorhaben nicht notwendig. Außerdem wird dadurch die EXE um ca. 10...20 KByte kleiner.


(3b) Etliche Nachnutzer des Projekts beklagen, daß das Script bei ihnen nicht läuft. Ursache war stets, daß ein ungeeigneter Server betrieben wurde.

Nicht jeder Server hat die Windows-CGI-Schnittstelle zur Unterstuetzung dieser Technologie. Getestet wurde mit dem Server Omni-HTTPd unter Win95 ( http://www.omnicron.ab.ca/httpd/ ).

Der MS-Personal-WebServer oder der IIS gehen definitiv nicht. Für diese Server empfehle ich Standard-CGI (siehe meine alternative Lösung), das unter http://www.rrz.uni-hamburg.de/philsem/stefan_mueller/wincgi/index.html prima beschrieben ist.


(4) alternative Lösung unter Standard-CGI

In Anbetracht der der vielen Anfragen zu meinem Artikel im PC-Magazin DOS 10/97 habe ich mich entschlossen, einen zusätzlichen Service einzurichten.

Ich verwende nun Standard-CGI. Das bedeutet aber, daß unbedingt eine 32-bit-EXE erzeugt werden muß, die als Konsolen-Anwendung läuft. Delphi1-Programmierer gucken mit dieser neuen Variante in den Mond. Die (einzige) Projektdatei dazu ist bei mir unter CgiTelef.pas zu haben. Ich habe das Projekt möglichst 1 zu 1 auf Standard-CGI umgesetzt. Dabei konnte ich aber nicht immer auf schönen Programmierstil achten. Bessermachen ist erlaubt. Es wird für Standard-CGI keine Freeware-Komponente mehr benötigt.

Gebrauchsanleitung:

Das Script legt wie das Original-Projekt die Daten des Telefonbuches in die Datei C:\Dat\TeleBuch.txt. Das Verzeichnis und die Datei werden selbständig angelegt.


Anhang: Programmlistings


Viel Erfolg bei eigenen Versuchen!


[ Seitenanfang ] [ Win-CGI ]

J. Hummel,   1997