Feststellen ob das Programm von einer Konsole gestartet wurde ...
-
Hallo,
ich möchte ein Windows Programm (keine Konsolenanwendung) schreiben. Wenn das Programm von einer Konsole bzw. mit Kommandozeilenargumenten gestartet wurde, möchte ich die vorhandene Konsole für Ausgaben benutzen.
D.h. mit Kommandozeilenargumenten soll es sich wie eine Konsolenanwendung verhalten ...
Mit AllocConsole() erzeuge ich ja eine neue Konsole. Ich möchte aber die vorhandene benutzen ...
In der MSDN habe ich AttachConsole() gefunden. Das Programm soll aber auch auf Windows 98 laufen.
Ich habe auch schon in der FAQ und im Forum gesucht, aber nichts passendes gefunden ...
Ist soetwas überhaubt möglich ?
Ich verwende Dev-C++ 4.9.8.5.
Vielen Dank für die Hilfe !
Gruß
Fiffi
-
Kann mir denn niemand einen Tipp geben ?
-
so wie ich das einschätze wird das sehr kompliziert, aber mal ein paar ideen:
festellen ob von konsole gestartet: aktives fenster (solange deins nicht aktiv ist) hat die klasse "tty"
console+fenster in EINEM programm: höchstens mit eigenem startup code (viel spass)da der compiler je nach programmart unterschiedliche 'einprungadressen' verwendet (main bzw. winmain)die einzigste möglichkeit die sehe wäre eine (mind) dreiteilung:
a)console ausgabe
b)fenster ausgabe
c)eines dass die parameter entgegen nimmt /
einen laufenden ausgabeprozess sucht bzw.
einen passenden erstell /
und schliesslich die daten an den prozess sendet
-
Hallo Lui,
so wie ich das einschätze wird das sehr kompliziert
Danke ! Es hätte ja sein können, ich hätte was übersehen ...
Gruß
Fiffi
-
Moin, Moin...
Wenn Dein Programm startet, kannst Du nach einem Konsolenfenster suchen(EnumWindows). Allerdings ist der Klassenname der Konsolenfenster nicht immer tty. Dieser Klassenname wird bei Win 9x benutzt. Unter NT, XP, 2000 heißen Konsolenklassen ConsoleWindowClass. Wenn tatsächlich eine Konsole vorhanden ist, musst Du Deine Anwendung mit der Konsole verbinden(d.h. Standardausgabe auf das Konsolenfenster umleiten). Erst dann ist eine Ausgabe möglich.
Wenn Deine Anwendung Parameter bekommt, heißt das aber noch nicht, dass ein Programmstart über Kommandozeile erfolgte. Einer GUI-Anwendung können ja auch Parameter mittels einer Verknüpfung übergeben werden. In diesem Fall müsstest Du selber eine Konsole öffnen. Vielleicht solltest Du überlegen, ob es nicht besser wäre immer selber eine Konsole zu öffnen, wenn Parameter übergeben wurden.
Ciao...
-
Hallo Kal El,
Wenn tatsächlich eine Konsole vorhanden ist,
Was mache ich wenn mehrere Konsolen vorhanden sind ?
Kann ich den Konsolenbildschirm auslesen, und überprüfen ob der Dateiname meiner Anwendung enthalten ist ?musst Du Deine Anwendung mit der Konsole verbinden(d.h. Standardausgabe auf >das Konsolenfenster umleiten). Erst dann ist eine Ausgabe möglich.
Wie mache ich dies ?
Einer GUI-Anwendung können ja auch Parameter mittels einer Verknüpfung >übergeben werden. In diesem Fall müsstest Du selber eine Konsole öffnen.
Dann könnte ich ja eine Warnung/Fehlermeldung ausgeben ...
Vielleicht solltest Du überlegen, ob es nicht besser wäre immer selber eine
Konsole zu öffnen, wenn Parameter übergeben wurden.Bei meinem Programm handelt es sich um ein Programm, das einen Mikrocontroller flasht (programmiert/brennt).
Es soll auch im Makefile (des Mikrocontroller Compilers) aufrufbar sein.
(Hier eine weitere Konsole zu öffnen halte ich nicht für sinnvoll ...)Außerdem wollte ich eine GUI-Version zur Verfügung stellen...
Gruß
Fiffi
-
Hallo fiffi,
ich habe herumexperimentiert. Wenn ich eine GUI-Anwendung durch Anklicken des Icons starte, so erhält man mit der Funktion GetStdHandle(STD_OUTPUT_HANDLE) kein Ausgabe-Handle. Starte ich das Programm aber von der Konsole, so gibt GetStdHandle(STD_OUTPUT_HANDLE) tatsächlich einen Wert zurück. So kannst Du prüfen, ob Dein Programm von der Konsole aus gestartet wurde. Allerdings ist es nicht möglich die Anwendung mit dem Konsolenfenster zu verbinden(für z.B. printf()) oder mittels WriteConsole() direkt in das Fenster zu schreiben. Das liegt wohl daran, dass das Konsolenfenster von einem fremden Prozeß erzeugt wurde(cmd.exe oder conagent.exe). Daher ist es Deiner GUI-Anwendung verboten diese Konsole zu nutzen. Hier hilft tatsächlich nur eine eigene Konsole zu öffnen.
Du könntest aber auch eine Konsolenanwendung schreiben, die ein GUI-Fenster öffnet. Dann werden alle Ausgaben automatisch in das Konsolenfenster geschrieben, wenn die Anwendung auf Kommandozeilenebene gestartet wird.
Ciao