Forum: PC-Programmierung Kommandozeilenprogramm forciert innerhalb von cmd aufrufen


von Dirac I. (dirac-impuls)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe in Windows eine *.exe-Datei, die beim Aufrufen ein "eigenes" 
Kommandozeilenprogramm startet.

Ich bekomme es nicht hin, dass dieses Programm "innerhalb" von cmd.exe 
ausgeführt wird, damit ich z.B. mit Python Befehle ausführen und die 
Programmausgabe auswerten kann.

Es handelt sich dabei um einen dedizierten Server für das Spiel 
Wreckfest.

Beim Aufruf aus cmd startet immer ein separates Kommondozeilenprogramm 
(siehe Anhang). Auch beim Ausführen in Python mit z.B. 
subprocess.Popen(...) wird das Programm "extern" als eigenes Programm 
ausgeführt und ich erhalte im Python Programm nicht die Ausgabe vom 
Server. Übrigens: Das Spiel selbst (nicht als dedizierter Server) wird 
mit derselben *.exe Datei ausgeführt, in diesem Fall aber ohne den 
Parameter "-s" um den dedizierten Server zu starten. In diesem Fall 
erhalte ich mit subprocess.Popen(...) Kommandozeilenausgaben in stdout, 
obwohl das Spiel "als eigenes Programm / Fenster" geöffnet wird.

Hat jemand von euch vielleicht noch einen Trick auf Lager, z.B. wie ich 
das Programm forciert innerhalb von cmd öffnen kann oder ähnliches?

Danke und viele Grüße

von Sebastian R. (sebastian_r569)


Lesenswert?

server.exe | python meinpythonprogramm.py

Die Pipe | sollte dann den stdout zu deinem Pythonscript stdin umleiten.

von Harald K. (kirnbichler)


Lesenswert?

Dirac I. schrieb:
> Beim Aufruf aus cmd startet immer ein separates Kommondozeilenprogramm

Wenn das Programm eine neue Konsole aufmacht, dann tut es das.

Dazu gibt es die Win32-API-Funktion "AllocConsole".

Man müsste via DLL-injection o.ä. dem Programm eine alternative Version 
von "AllocConsole" unterjubeln, die keine neue aufmacht, sondern einfach 
nur ein Handle auf die bestehende zurückgibt.

Sofern mit CreateProcess ein neuer Prozess gestartet wird, kann mit dem 
Flag CREATE_NEW_CONSOLE ebenfalls das Erzeugen einer neuen Konsole 
erzwungen werden.

Hier könnte man überlegen, ob man das betreffende Programm patcht, um 
das Flag zu entfernen ...

Lesematerial:
https://learn.microsoft.com/en-us/windows/console/creation-of-a-console

von Dirac I. (dirac-impuls)


Lesenswert?

Hallo zusammen,

vielen Dank für eure Hilfe! :-)

@Sebastian:
Ich habe deine Lösung ausprobiert, sie scheint aber ebenfalls nur bei 
Programmen zu funktionieren, die kein eigenes Kommandozeilenprogramm 
öffnen. Ich habe es mit folgenden beiden Aufrufen ausprobiert:

Wreckfest_x64.exe -s server_config=server_config.cfg | python 
WreckfestServerTest.py

start /B Wreckfest_x64.exe -s server_config=server_config.cfg | python 
WreckfestServerTest.py

In beiden Fällen öffnet sich der Server von Wreckfest extern als 
Kommandozeilenprogramm und mein Python Script bekommt im stdin keine 
Daten. Mit einem "klassischen" Programm, das über stdin und stdout 
kommuniziert funktioniert deine Lösung (getestet mit der Schachengine 
stockfish).

@Harald
Ich vermute mitlerweile auch, dass man um solche Hackereien nicht herum 
kommt. Da ich davon wenig Ahnung habe, erscheint mir der Aufwand 
allerdings zu hoch und der Nutzen dieses Projektes zu gering, als dass 
ich mich da ranwagen werde. :-)

Viele Grüße und nochmals vielen Dank für eure Hilfe! :-)

von Jens G. (jensig)


Lesenswert?

Dirac I. schrieb:
> Ich bekomme es nicht hin, dass dieses Programm "innerhalb" von cmd.exe
> ausgeführt wird, damit ich z.B. mit Python Befehle ausführen und die
> Programmausgabe auswerten kann.

Das geht auch nicht, weil Dein Programm kein Kommandozeilenprogramm ist, 
sondern ein ganz normales GUI-Programm. Sieht man ja schon am Icon oben 
links. Damit kann es nicht direkt in der Kommandozeile laufen, und es 
benutzt damit sicherlich auch keinerlei STDIO-Funktionalität, womit man 
den Output via Umleitung oder Pipen abgreifen kann (obwohl es sicherlich 
auch als GUI-Programm STDIO benutzen kann, wenn die Entwickler das denn 
nur wöllten ...)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.