Gibt es ein Windows-Programm zum Laden untergeordneter Prozessabbilder mit umgeleitetem stdout / stderr?

605
amn

Ich habe ein Programm, das stdout und stderr zur Verfügung hat, so dass es wichtige Ausgaben auf diesen Kanälen schreiben kann. Diese Ausgabe wird nur angezeigt, wenn Sie sie z. B. über ein Befehlsinterpreter oder Powershell von einem Windows-Konsolenfenster aus starten. Andernfalls haben Sie offensichtlich keinen Platz, an dem Sie die Ausgabe sehen können.

Da dieses Programm auch ohne angefügtes Konsolenfenster funktioniert und da es sich sonst um eine GUI-Anwendung handelt, möchte ich lieber vermeiden, dass Benutzer über die übergeordnete oder angehängte Konsole verwirrt werden. Das Programm wird am besten ohne eine für alle Anwendungsfälle außer Debugging verwendet.

Nun möchte ich die Ausgabe trotzdem erhalten können, auch wenn kein Konsolenfenster verwendet wird. Ich bin sehr unklar, was die Verwaltung von Prozessdateien in Windows anbelangt.

Gibt es ein Programm, das dazu dient, ein Programm als Unterprozess zu starten, wobei stdout und stderr in eine oder mehrere Dateien umgeleitet werden?

Ich weiß, dass der gute alte Befehlsinterpreter und Powershell das zulassen, aber das tun sie nur mit einem Konsolenfenster, und ich möchte etwas, das kein solches Fenster hat. Ein Visual Basic-Skript-Host vielleicht? Ist das noch angesagt ? Irgendwelche anderen Lösungen?

1

1 Antwort auf die Frage

1
harrymc

Ich bin etwas verwirrt darüber, wie dieses Programm sowohl Konsole als auch GUI unterstützt, da Microsoft beide Modi so konzipiert hat, dass sie sich gegenseitig ausschließen.

Der Microsoft-Artikel Wie wird eine Anwendung als GUI- und Konsolenanwendung erstellt? sagt das:

In Windows sind GUI-Anwendungen und Konsolenanwendungen sehr unterschiedlich. GUI-Anwendungen haben mindestens ein Fenster und eine Meldungsschleife, jedoch keinen Standardein- / ausgang / -fehler. Konsolenanwendungen haben standardmäßige In / Out / Fehler, aber kein Fenster, keine Nachrichtenschleife. Eine Anwendung ist entweder eine GUI-Anwendung oder eine Konsolenanwendung, jedoch nicht beides.

Einige Leute möchten, dass sich ihre Anwendung je nach Eingabe unterschiedlich verhält. Bei Eingaben verhält sich die Anwendung wie eine Konsolenanwendung. Wenn keine Eingabe erfolgt, verhält es sich wie GUI-Anwendungen.

Anschließend werden zwei mögliche Lösungen aufgelistet.

  1. Der .comversus .exeTrick ( .comimmer schon früher gefunden .exe)

In VisualStudio gibt es tatsächlich zwei Binärdateien: devenv.com und devenv.exe. Devenv.com ist eine Konsolen-App. Devenv.exe ist eine GUI-App. Wenn Sie devenv eingeben, wird devenv.com aufgrund der Win32-Prüfregel ausgeführt. Wenn keine Eingabe erfolgt, startet devenv.com devenv.exe und beendet sich selbst. Wenn es Eingaben gibt, behandelt devenv.com sie als normale Konsolen-App.

  1. Die Respawn-Methode

Im Fall von Iildasm gibt es nur eine Binärdatei: ildasm.exe. Es wird zuerst als GUI-Anwendung kompiliert. Später wird es mit editbin.exe als Konsolenteilsystem markiert. In seiner Hauptmethode wird festgelegt, ob es als Konsolenmodus oder GUI-Modus ausgeführt werden muss. Wenn es als GUI-Modus ausgeführt werden muss, stellt es sich als GUI-App um.

Ich weiß nicht, welche Methode von Ihrem Programm verwendet wird, und es wäre interessant, das herauszufinden. Mit dem kostenlosen Prozessmonitor können Sie nachverfolgen, was der Fall ist.

Wenn das Problem beim Starten des Programms über eine Konsole das schwarze Fenster der Konsole ist, das hinter dem Programm angezeigt wird, gibt es in jedem Fall eine Lösung. Wenn Sie die Konsole als ausgeblendet starten, wirkt sich dies nicht auf die Anzeige der GUI aus, die weiterhin sichtbar ist.

Siehe meine Antwort im Beitrag Eine Batchdatei vollständig versteckt ausführen . Jede der beschriebenen Lösungen sollte funktionieren, es sei denn, die von Ihrem Programm für die Unterstützung von Konsole und GUI gewählte Methode kann es sabotieren.

Ich bin mir ziemlich sicher, dass das Programm eine Windows Desktop (GUI) -Anwendung ist, die einfach `printf 'oder eine andere Systemfunktion aufruft, die versucht, in die Standardausgabedatei zu schreiben. Da das Handle normalerweise nicht für GUI-Anwendungen eingerichtet ist, wird die Ausgabe nicht weitergeleitet. Dies bedeutet jedoch nicht, dass das Programm ansonsten nicht funktioniert. Die Aufrufe von `printf 'lösen keine Ausnahme oder nichts aus. Ich habe gerade eine kleine GUI-Anwendung geschrieben, die "printf" aufruft - nichts erscheint überall, aber das Programm wird nicht angehalten. Wenn ich einen gültigen Standardausgabegriff anhebe, sollte ich mindestens die Ausgabe erfassen. amn vor 5 Jahren 0
Wenn dies nicht der Fall ist, kann es sein, dass ein Konsolenprogramm eine GUI startet, was durchaus möglich ist. Die hidden cmd-Methode sollte weiterhin funktionieren, wenn sie nicht mit dem, was sie tut, in Konflikt steht. harrymc vor 5 Jahren 0