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.