Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ausgabe eines DOS-Programmes empfangen (https://www.delphipraxis.net/1220-ausgabe-eines-dos-programmes-empfangen.html)

rebugger 2. Nov 2002 09:40


Ausgabe eines DOS-Programmes empfangen
 
Hallo,
ich möchte mit Delphi HTML-Code an ein DOS-Programm schicken !
Dieses verarbeitet es und gibt den neuen Code aus (Das DOS-Programm existiert bereits).

Diese Ausgabe des neuen Codes möchte ich wiederum mit meinem Programm abfangen und in eine Datei abspeichern.

Wie mach ich das ? Hat jemand ein Tut oder ein paar Befehle für mich ?

Daniel B 2. Nov 2002 09:44

Hmm,

wenn das DOS-Programm auch von Dir ist und du noch was dran basteln kannst, dann könntest Du das Programm mit Parametern öffnen, nachdem es die Daten verarbeitet hat, könnte das DOS, wieder die WIN-Version mit Parametern übergeben. Damit könntest Du die Daten recht einfach hin und her schicken. Ich weiss jetzt allerdings nicht, wie lange die Parameter sein dürfen. Aber Du könntest ja auch nur einen Pfad zur Datei angeben, ohne die Daten an sich zu übergeben. Das wäre am einfachsten.

rebugger 2. Nov 2002 09:47

Leider ist es nicht von mir, und nachprogrammieren wäre zu schwer.
Die eingabe sieht in etwa so aus:
Code:
datei.exe <html>...</html>
und dann gibt das programm unmittelbar danach die ausgabe zurück !

Daniel B 2. Nov 2002 09:49

Zitat:

Zitat von rebugger
und nachprogrammieren wäre zu schwer.

So, so... :mrgreen: Was macht denn dieses Programm genau, wenn man fragen darf?

rebugger 2. Nov 2002 09:51

naja, ok...
ich habe das ganze vereinfacht.
ich arbeite in letzter zeit viel mit php !
Die DOS-Datei ist der Parser php.exe
Mein Programm liest eine .php-Datei aus, übergibt diese an die php.exe, empfängt den entstandenen HTML-Code, speichert ihn und zeigt ihn an !
(also praktisch als Server-Software für CDs [also ohne installation])

Daniel B 2. Nov 2002 09:58

Hmm, ich frage mich gerade wie lang die Parameter sein dürfen, die man bei einem Programm übergibt. Der HTML-Code kann ganz schnell mal 3-400Zeilen haben, dann noch der ganze Text, ob man wirklich soo viel Daten übergeben kann?!?

rebugger 2. Nov 2002 10:01

Hm, ich weiß auch nicht...
Wie macht das der Apache-Server ?

Chewie 2. Nov 2002 10:09

Also die Ausgabe einer Konsolenanwendung in eine Textdatei umleiten, geht ganz leicht. Du musst nur die Datei folgendermaßen starten:
Code:
start.exe -parameter1 -parameter2 > ausgabe.txt
So wird die Ausgabe in die ausgabe.txt gespeichert.

Wie ein Webserver die PHP.exe aufruft, weiß ich auch nicht, aber ich in mir recht sicher, dass er das nicht über die Parameterliste macht. Vielleicht über Named Pipes, aber vielleicht findest du irgendwo wie es z. B. der Apache macht.

Daniel B 2. Nov 2002 10:21

Nun, ich würde sagen das der Apache, die Datei erzeugt, bzw. er schreibt die Daten in eine Temporäre Datei, diese Datei wird dann einfach nur auf dem Server abgelegt. Bei Zugriff landet sie im Cache des Browsers und der zeigt dann alles an. Irgendwie so ähnlich. :cat:

rebugger 2. Nov 2002 10:25

OK, hab ein bißchen was zusammengebastelt:
Code:
Uses ShellAPI;

procedure TMain.FormCreate(Sender: TObject);
var
  PHPstring: TStringlist;
  PHPoutput: String;
begin
  PHPpath := 'php.exe';
  PHPfile := 'index.php';

  PHPstring.LoadFromFile(PHPfile);
  PHPoutput := '>c:\ausgabe.htm';
  PHPstring.Text := StringReplace(PHPstring.Text, #13#10, '', [rfReplaceAll]);

  ShellExecute(0, nil, PHPpath + ' ' + PHPstring[0] + ' ' + PHPoutput, nil, nil, SW_SHOW);

  WebBrowser.Navigate('c:\ausgabe.htm');
end;
Nur leider sagt er bei ShellExecute:
[Fehler] main_unit.pas(89): Inkompatible Typen: 'String' und 'PChar'

Daniel B 2. Nov 2002 10:31

Hallodriii,

Du solltest PHPOutput mittel PChar(PHPOutput) in einen Char ändern. Bei den anderen auch.

Servus. :hi:

rebugger 2. Nov 2002 10:37

jo, ok, habe nun:
Code:
  PHPString := TStringList.Create;
  PHPstring.LoadFromFile(PHPfile);
  PHPoutput := '>c:\ausgabe.htm';
  PHPstring.Text := StringReplace(PHPstring.Text, #13#10, '', [rfReplaceAll]);

  MessageDlg(PHPpath + ' ' + PHPstring[0] + ' ' + PHPoutput, mtInformation, [mbOK], 0);
  ShellExecute(0, 'open', PChar(PHPpath + ' ' + PHPstring[0] + ' ' + PHPoutput), nil, nil, SW_NORMAL);
Es gibt keine Fehlermeldung !
Der Browser versucht c:\ausgabe.htm anzuzeigen, nur leider wurde sie nicht angelegt !
Per MessageDlg() habe ich mir zur Sicherheit den Text ausgeben lassen:
Code:
php.exe <?php phpinfo(); ?> >ausgabe.htm

Daniel B 2. Nov 2002 10:45

Du solltest die Datei selbst mit
Code:
FileCreate('C:\Windows\Desktop\text.txt');
anlegen.
Und dann nur noch zum Schreiben öffnen.

Christian Seehase 2. Nov 2002 11:47

Moin Rebugger,

ich hab' Deine letzten Codeschnipsel mal ein wenig überarbeitet:

Code:
[b]var[/b]
  PHPString : [b]string[/b];
  fsIN     : TFileStream;

[b]begin[/b]
  fsIN := TFileStream.Create(PHPFile,fmOpenRead);
  [b]try[/b]
    PHPString := StringOfChar(#00,fsIN.Size);
    fsIN.Read(PHPString[1],fsIN.Size);
    PHPoutput := '>c:\ausgabe.htm';
    PHPstring := StringReplace(PHPstring, #13#10, '', [rfReplaceAll]);
    MessageDlg(PHPpath + ' ' + PHPstring + ' ' + PHPoutput, mtInformation, [mbOK], 0);
    ShellExecute(0, 'open', PChar(PHPpath + ' ' + PHPstring + ' ' + PHPoutput), [b]nil[/b], [b]nil[/b], SW_NORMAL);
  [b]finally[/b]
    FreeAndNil(fsIN);
  [b]end[/b];
[b]end[/b];
Da Du offensichtlich nicht die einzelnen Zeilen brauchst (immerhin löscht Du ja alle Zeilenvorschübe), dürfte diese Variante etwas resourcensparender sein.
Bist Du sicher, dass es funktioniert, wenn Du alle Zeilenvorschübe löscht?

d3g 2. Nov 2002 11:49

Hi rebugger,

der Trick mit "> ausgabe.htm" funktioniert leider bei Win32-Konsolenanwendungen teilweise nicht mehr. ICh habe mal ein OpenSource-Prog geschrieben, das (auf der GBasis von einem Code von NicoDE) Konsolenoutputs abfängt, schau's dir mal an: http://www.gollatz.net/download.php?1.

MfG,
d3g

Christian Seehase 2. Nov 2002 11:53

Moin d3g,

ob die Umleitung mit > nicht funktioniert dürfte wohl davon abhängen, ob das Programm auf StdOut oder auf StdError schreibt.

In der Form

1> Dateiname

wird StdOut umgeleitet, in der Form

2> Dateiname

hingegen StdError.

theomega 2. Nov 2002 12:03

Der PHP-Parser kann die Befehle nicht verarbeiten, wenn sie als Parameter kommen. Du mußt die Befehle erst in eine Daten speichern und dann php.exe mit dem Dateinamen als Parameter. Die Ausgabe kannst du mit "> ausgabe.html" abfangen!

d3g 2. Nov 2002 12:27

... oder (eleganter) die Daten über eine Pipe auf den StdIn des Programms schreiben.

@Chris: Auf meinem System (Windows ME) macht der >-Operator sowohl mit dem StdOut als auch mit dem StdErr manchmal (!) Probleme. Keine Ahnung woran das liegt.

MfG,
d3h

Christian Seehase 2. Nov 2002 13:58

Moin d3g,

ich kenn', im Wesentlichen, nur NT 4 / W2K. Da hatte ich solche Probleme noch nie.
Und ich brauche diese Umleitungen öfter mal. ;-)

ME = More Errors :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz