AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Konsolenanwendung mit Umleitung debuggen
Thema durchsuchen
Ansicht
Themen-Optionen

Konsolenanwendung mit Umleitung debuggen

Ein Thema von Union · begonnen am 7. Jun 2019 · letzter Beitrag vom 7. Jun 2019
 
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
724 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 10:12
Hallo,

ich möchte eine Konsolenanwendung debuggen, die ihre Eingabe per Dateiumleitung erhält. Wird die Anwendung von der Kommandozeile heraus aufgerufen, funktioniert das auch. Im integrierten Debugger mit entsprechenden Startparametern allerdings nicht - dort wartet die Anwendung dann auf eine Tastatureingabe.

Delphi-Quellcode:
Program Redirect;


{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  Line : string;
begin
  try
    Readln(Line);
    writeln('Output', Line);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Start -> Parameter : <input.txt

Inhalt der Datei: Eingabe<CR/LF>

Die einzige Möglichkeit die ich bisher gefunden habe, ist das Einfügen einer Warteschleife:
Delphi-Quellcode:
      {$ifdef DEBUG}
      writeln('Debugger');
      while not IsDebuggerPresent do
      begin
        Sleep(100);
      end;
      asm
        int 3;
      end;
      {$endif}
Dann wird die Anwendung auf der Kommandozeile gestartet und über Start->Mit Prozess verbinden funktioniert es.

Ebenfalls ausprobiert habe ich es mit cmd.exe /c als Hostanwendung, das Verhalten ändert sich aber nicht.

Wie kriege ich das mit dem integrierten Debugger und direktem Start hin?
Geht nicht, da dieses redirecting eine Funktion des command interpreters ist und nicht des Programms oder des Betriebssystems selbst. Was aber relativ einfach machbar ist: gib dem Programm eine Option, den Namen der Input-Datei als Parameter übergeben zu bekommen.

Allen Kode, der mit dem Input arbeitet, packst Du in eine Prozedure mit einen Var-Parameter vom Typ Textfile.

Beim Start überprüfst Du dann, ob ein Parameter übergeben wurde, wenn ja machst Du ein Textfile mit diesem Parameter auf und übergibst es an die Prozedure, wenn nein übergibst Du stattdessen Input (das ist der interne Name für stdin) an die Prozedur. Innerhalb derselben mußt Du nur bei jedem Read oder ReadLn den Namen des Parameters mit verwenden.

Für die weitere Verarbeitung spielt es keine Rolle, ob der Input aus einer Textdatei oder aus stdin kommt.
Peter Below
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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