Wie kann ich einen versteckten, verfügbaren Konsolenantrag stellen und mit dieser kommunizieren?

StackOverflow https://stackoverflow.com/questions/1295824

Frage

Ich habe eine kleine Konsolenanwendung geschrieben, um eine DLL von Drittanbietern zu wickeln, die Probleme hat. Ich rufe es von einer GUI -Anwendung mit Verwendung an _popen, und möchte nur einen Wert aus der Standardausgabe des Konsolenprogramms lesen. Dabei wird kurz ein unerwünschtes Konsolenfenster angezeigt.

Mir ist bewusst, dass dies durch Verwendung einer bestimmten Startupinfo -Konfiguration mit CreateRequesvision vermieden werden kann. Ich würde es jedoch bevorzugen, die Fix in die Konsolenanwendung zu setzen und trotzdem _popen zu verwenden. Das Erstellen des Kinderprozesses mit dem Windows -Subsystem (dh Winmain anstelle von Main) lässt das Konsolenfenster nicht verschwinden. Anscheinend wird eine Konsole vom Betriebssystem zugewiesen, um die _popen -Kommunikation zu erleichtern.

Beachten Sie, dass die DLL von Drittanbietern instabil ist, aber für die Schnittstelle mit proprietärer Hardware erforderlich ist. Daher ist jeder Ansatz, der die DLL im Speicherplatz der GUI -Anwendungen lädt, inakzeptabel.

War es hilfreich?

Lösung

1) Ich unterstütze die Idee, sie mit Startupinfo -Set zu starten, um das Fenster zu verbergen. Dies ist SOP unter Windows, daher funktioniert es besser als zu versuchen, Unix SOP aufzuzwingen. Darüber hinaus möchten Sie den Ausgang möglicherweise beim Testen isoliert sehen.

2) oder Sie können eine GUI -App erstellen, die niemals ein Fenster anzeigt. Es entspricht einer Konsolen -App ohne Konsole.

bearbeiten

Das Verknüpfung Indeera veröffentlicht zeigt, wie man die zweite Option macht.

bearbeiten

OK, wenn Sie nur Informationen an den Elternteil senden möchten, ist es am einfachsten, eine Datei zu schreiben. Eine Möglichkeit, dies ordentlich zu halten, besteht darin, dass der Elternteil einen einzigartigen Dateinamen als Befehlszeilenparameter passt, auf den das Kind schreibt. Der Elternteil kann die Datei überwachen und auf seinen Inhalt handeln.

Es gibt viele Alternativer. Die beiden bisher diskutierten Ansätze, die als Rohre bezeichnet werden, würden jedoch auch verschiedene Formen von IPC verwenden, einschließlich Socket-basiert.

Was Sie jedoch nicht tun können, ist Access Stdin/Stdout/Stderr ohne Konsole. Sie können mit einer versteckten Konsole starten, muss aber tatsächlich eine haben.

bearbeiten

Ermöglicht Lua die direkte Ausführung der ausführbaren Datei anstelle von cmd.exe direkt aus?

Andere Tipps

Kommunikation zwischen einer übergeordneten GUI -Anwendung und einer versteckten Untersuchung der untergeordneten Konsolenreferenz Die folgenden MSDN -Artikel:

Ich glaube nicht, dass Sie Stdin/Stdout verwenden können, ohne dass sie die Konsole starten. Was Sie jedoch tun können, ist das Schreiben der Wrapper -App als GUI -App, die kein Fenster anzeigt (einfach main () an winmain ()) und dann einen IPC -Mechanismus wie ein Socket oder einen gemeinsam genutzten Speicher verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top