Announcement

Collapse
No announcement yet.

Pipe-Zeichen in Consolenanwendung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Pipe-Zeichen in Consolenanwendung

    Hallo,

    ich habe folgendes Problem:

    von einem Delphi (5.0) - Programm aus soll das Konsolenprogramm mysql
    zwecks Abarbeitung von SQL-Skripts gestartet werden. Ich habe dazu das
    Beispiel "ReadDos" bzw. auch "ExecAppAndWait" von Andreas Kosch aus
    "Delphi Win32 Lösungen" benutzt.

    Dabei tritt das Problem auf, daß das Pipe-Zeichen "<" nicht richtig interpretiert wird.

    Eingaben wie

    StrPCopy(szAppName, 'c:\mysql\bin\mysql.exe ' + #60 + ' crdat.sql');

    oder

    StrPCopy(szAppName, 'c:\mysql\bin\mysql.exe < crdat.sql');

    funktionieren nicht, ebenso in "ExecAppAndWait". Hier habe ich verschiedenes
    ausprobiert: obige Angabe in sApp, Pfad-Angabe in der Directory-Variablen, den
    Kommando-Parameter " < crdat.sql" in der sParams-Konstanten usw.

    Das Zeichen wird einfach nicht erkannt. Ohne Kommandoparameter läßt sich
    mysql von Delphi aufrufen.
    Im DOS-Fenster von Windows (95) kann ich 'c:\mysql\bin\mysql.exe < crdat.sql'
    problemlos eingeben.

    Was ist zu tun?

    Vielen Dank für eure Hilfe!
    Jürgen

  • #2
    Hallo,

    das Zeichen ">" ist nicht einfach nur ein Zeichen, sondern der Bezug auf die Standard-Ausgabe (STDOUT) des Prozesses. Wenn eine eigene Consolen-Anwendung darauf zugreifen will, muss sie über den Aufruf der Win32-API-Funktion <b>GetStdHandle(STD_OUTPUT_HANDLE)</b> ein Handle auf die Standardausgabe anfordern. Wenn ich mich richtig erinnere, gab es da einige Nebenwirkungen (Verzicht auf WriteLn), so dass das folgende Beispiel nicht im Buch gelandet ist ;-)

    <pre>
    program StdOutTest;

    {$APPTYPE CONSOLE}

    uses
    SysUtils, Windows;

    {$R *.RES}

    var
    hStdOut : THandle;

    procedure WriteStdHdl(Handle: THandle; Text: String);
    var
    dwChars : DWORD;
    pBuffer : Pointer;
    begin
    pBuffer := PChar(text);
    WriteFile(Handle, pBuffer^, Length(text), dwChars, nil);
    pBuffer := PChar(#13#10);
    WriteFile(Handle, pBuffer^, 2, dwChars, nil);
    end;

    procedure ShowHelpInfo;
    begin
    WriteStdHdl(hStdOut, 'Syntax: StdOutTest > log.txt');
    end;

    begin
    hStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
    if ParamCount = 0 then
    ShowHelpInfo;
    WriteStdHdl(hStdOut, 'Hallo - ich bin eine Console.');
    WriteStdHdl(hStdOut, 'Wenn mein Output in eine Datei umgeleitet wird');
    WriteStdHdl(hStdOut, 'kann der Inhalt archiviert werden.');
    WriteStdHdl(hStdOut, 'In einer BAT-Datei sollte der Rückgabewert');
    WriteStdHdl(hStdOut, 'jedoch auch erreichbar sein!');
    end.
    </pre>
    Sinngemäss das Gleiche wird für die Standard-Eingabe gelten, aber dafür habe ich kein Beispiel auf Lager.
    &#10

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für das Beispiel!

      Leider habe ich es - bin "API-Neuling" - nicht verstanden. Ich habe das Programm übernommen und compiliert, auch eine log.txt angelegt, nichts wurde umgeleitet.

      Ich habe auch keinen Schimmer, wie ich den Handle in CreateProcess(..) reinbekomme. Wobei ich auch nicht weiß, ob ">" genauso wie "<" behandelt wird.

      Vielleicht kannst Du mir auf die Sprünge helfen?

      Vielen Dank.
      Jürge

      Comment


      • #4
        Hallo,

        das Beispiel leitet seinen Output in die Datei um, liest aber keine Infos ein. Wenn das Programm mit <b>StdOutTest > log.txt'</b> aufgerufen wird, sollte der Text in log.txt zu finden sein.

        Und die Frage nach CreateProcess macht mir deutlich, dass ich die Frage vermutlich beim ersten (oberflächlichen) Lesen nicht korrekt interpretiert habe. Denn es geht nicht darum, im <b>eigenen</b> Konsolenprogramm auf die Standard-Eingabe zurückzugreifen, sondern es soll ein Fremdprogramm gestartet werden. In diesem Fall würde ich den Aufruf <i>'c:\mysql\bin\mysql.exe < crdat.sql'</i> in eine BAT-Datei verpacken und im eigenen Programm nur die BAT aufrufen. Somit wird die Aufgabe der korrekten Umleitung auf den Befehlszeileninterpreter abgeschoben (denn der kann es von Haus aus)

        Comment


        • #5
          Hallo Andreas,

          mit der Batch-Datei klappt es einwandfrei!

          Vielen Dank für Deine prompten Tips!
          Jürge

          Comment

          Working...
          X