Entwickler-Ecke

Windows API - Standardausgabe Umleiten in die Konsole(WriteLn)


reimo - Do 06.09.07 14:27
Titel: Standardausgabe Umleiten in die Konsole(WriteLn)
Hi!

möchte abhängig davon, ob das programm mit parametern aufgerufen wordes ist oder nicht, es entweder als Konsolen (mit Parameter) oder Win-Anwendung laufen lassen!

hab mir gedacht, dass ich im dpr-File eine Abfrage einbau, ob Parameter übergeben worden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  
if ParamCount > 0 then begin
     writeln('32423');
  end     
  else begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;


meine erste frage ist: Darf ich das machen???

und das zweite wäre: Da die Applikation nicht als konsolenanwendung kompiliert wurde, ist die Ausgabe von writeln nicht auf StandardOut gesetzt!
Wie mach ich das jetzt aber, dass obwohl nicht als konsolenanwendung kompiliert, ich trotzdem in die konsole schreiben kann?

danke!


ene - Do 06.09.07 15:01

Hi,

folgendes in die DPR nach Program XXX einfügen:

Delphi-Quelltext
1:
2:
//Einfügen in normale GUI-Anwendung. Erzeugt das Konsolenfenster.
{$APPTYPE CONSOLE}


Und dann kannst du das so in der DPR auswerten:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
If (Bedingung=True) Then Begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;  Application.Run;
  End Else Begin
    Writeln('3234');
  End;


reimo - Do 06.09.07 15:31

user profile iconene hat folgendes geschrieben:
Hi,

folgendes in die DPR nach Program XXX einfügen:

Delphi-Quelltext
1:
2:
//Einfügen in normale GUI-Anwendung. Erzeugt das Konsolenfenster.
{$APPTYPE CONSOLE}


Und dann kannst du das so in der DPR auswerten:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
If (Bedingung=True) Then Begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;  Application.Run;
  End Else Begin
    Writeln('3234');
  End;


Hi,

danke, aber mit dieser methode wird immer ein konsolenfenster miterzeugt, egal ob ich das programm mit parametern oder ohne erzeuge!
ich möchte aber nur dann eine konsolenanwendung, wenn parameter übergeben wurden.


GTA-Place - Do 06.09.07 15:37
Titel: Re: Standardausgabe Umleiten in die Konsole(WriteLn)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if ParamCount > 0 then begin
     writeln('32423');
  end     
  else begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;


ParamCount ist immer > 0, weil als 1. Parameter der Pfad des Programmes übergeben wird. Also wenn, dann auf > 1 prüfen.


reimo - Do 06.09.07 15:50
Titel: Re: Standardausgabe Umleiten in die Konsole(WriteLn)
user profile iconGTA-Place hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if ParamCount > 0 then begin
     writeln('32423');
  end     
  else begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;


ParamCount ist immer > 0, weil als 1. Parameter der Pfad des Programmes übergeben wird. Also wenn, dann auf > 1 prüfen.


nein, eben nicht! ;o)


JayEff - Do 06.09.07 16:13
Titel: Re: Standardausgabe Umleiten in die Konsole(WriteLn)
user profile iconreimo hat folgendes geschrieben:
nein, eben nicht! ;o)
Da hat er Recht. (getestet).
Nun, die einzige Möglichkeit eine Compilerdirektive weg zubekommen ist mit einer anderen Direktive. Problem dabei: diese Direktive ( {$IF} {$ENDIF} ) kann (natürlich) nur Konstanten abfragen, da die Änderung vom Compiler vorgenommen wird und nicht erst zur Laufzeit.
Eine denkbare Lösung wäre ein zweites Programm mitzuliefern(eine Console app), welches mit evtl. vorhandenen Parametern gestartet wird, wenn ParamCount>0 ist, dann wird das Hauptprogramm beendet.


reimo - Do 06.09.07 16:18
Titel: Re: Standardausgabe Umleiten in die Konsole(WriteLn)
user profile iconJayEff hat folgendes geschrieben:
user profile iconreimo hat folgendes geschrieben:
nein, eben nicht! ;o)
Da hat er Recht. (getestet).
Nun, die einzige Möglichkeit eine Compilerdirektive weg zubekommen ist mit einer anderen Direktive. Problem dabei: diese Direktive ( {$IF} {$ENDIF} ) kann (natürlich) nur Konstanten abfragen, da die Änderung vom Compiler vorgenommen wird und nicht erst zur Laufzeit.
Eine denkbare Lösung wäre ein zweites Programm mitzuliefern(eine Console app), welches mit evtl. vorhandenen Parametern gestartet wird, wenn ParamCount>0 ist, dann wird das Hauptprogramm beendet.


ok, das mit der zweiten app wäre möglich! aber es geht sicher auch anders! ich muss doch den Output für WriteLn,... irgendwie im code umleiten können! kann ich mir nicht den devicecontext vom Konsolenfenster holen und dann den output hinleiten? kenn mich da leider zuwenig aus, aber das müsste doch gehen


BenBE - Do 06.09.07 17:38

IIRC konnte man auch für eine Nicht-Konsolen-Anwendung nachträglich die Konsole initialisieren und damit das Konsolen-Fenster nutzen. Find aber grad in den System-Units nicht die nötigen Stellen.


Reinhard Kern - Do 06.09.07 18:42

user profile iconBenBE hat folgendes geschrieben:
IIRC konnte man auch für eine Nicht-Konsolen-Anwendung nachträglich die Konsole initialisieren und damit das Konsolen-Fenster nutzen. Find aber grad in den System-Units nicht die nötigen Stellen.


Nix System, Win32-API: AllocConsole.

Gruss Reinhard