Ich habe versucht, eine Windows-Eingabeaufforderung in C # neu zu codieren. Ich habe mich gefragt, woher die Eingabeaufforderung weiß, wann auf das Beenden des Prozesses gewartet werden muss und wann nicht auf das Beenden des aufgerufenen Prozesses gewartet werden muss.
Wenn Sie beispielsweise die Eingabeaufforderung "notepad" eingeben , wird Notepad gestartet, Sie können jedoch weiterhin andere Befehle ausführen. Wenn Sie jedoch ein Dienstprogramm wie more.com, ping.exe oder ein anderes Dienstprogramm öffnen, wartet es, bis das ausführende Programm beendet ist, bevor Sie einen anderen Befehl ausführen können.
Woher weiß die Eingabeaufforderung, wann auf das Beenden gewartet werden muss, und wie kann dieses Verhalten in C # emuliert werden?
c#
windows
command-prompt
Justin Krejcha
quelle
quelle
Antworten:
Wenn es sich bei der Anwendung um eine Win32-GUI-Anwendung handelt, wird sie nur ausgeführt und die Eingabeaufforderung wartet nicht auf das Beenden.
Wenn es sich bei der Anwendung um eine Konsolenanwendung handelt, wird sie an der Eingabeaufforderung ausgeführt, und Sie müssen warten, bis sie abgeschlossen ist, um die Eingabeaufforderung wieder zu erhalten.
BEARBEITEN:
OK. Es scheint, dass Sie eine technische Erklärung benötigen. Wenn Sie dieselbe Funktion in Ihrer Anwendung emulieren möchten, können Sie hier die
IMAGE_OPTIONAL_HEADER
EXE-Dateien überprüfen .Im Inneren
IMAGE_OPTIONAL_HEADER
gibt es:If SubSystem == 0x02
Es bedeutet, dass es sich um eine GUI-Anwendung handelt.If SubSystem == 0x03
Es bedeutet, dass es sich um eine Eingabeaufforderungs-App handelt.EDIT 2:
Wenn Sie es in Aktion sehen möchten:
Laden Sie http://www.ntcore.com/exsuite.php herunter
Kopieren Sie calc.exe oder notepad.exe auf Ihren Desktop
Öffnen Sie die kopierte calc.exe im CFF Explorer
Navigieren Sie zu Nt-Header -> Optionale Header
Ändern Sie das Subsystem von 0x002 in 0x003
Speichern Sie es
Führen Sie nun die neue geänderte Berechnung aus, und die Eingabeaufforderung wartet darauf, dass sie beendet wird.
quelle
Standardmäßig wird an einer Eingabeaufforderung das GUI-Programm in einem separaten Prozess / Fork erzeugt. Sie können den Editor (oder ein anderes GUI-Programm) jedoch inline mit Ihrer Eingabeaufforderung / Ihrem Shell-Skript ausführen:
Auf diese Weise wird die Eingabeaufforderung / das Shell-Skript erst fortgesetzt, nachdem der Prozess notepad.exe beendet wurde.
Hoffe das hilft, TW
quelle
Wenn Sie einen neuen Prozess starten, eine GUI-Anwendung in diesem Kontext, die tatsächlich außerhalb der Grenzen der Eingabeaufforderung funktioniert, wartet die Eingabeaufforderung nicht. Wenn Sie jedoch einen Befehl ausführen, der vollständig unter den Grenzen der aktuellen Instanz einer Eingabeaufforderung funktioniert, wartet er.
Der Befehl
notepad
startet also nur die Notepad-Anwendung und überlässt die Kontrolle über die Anwendung. Währenddessen wird der Befehlipconfig
unter einer Domäne (nein, dies ist keine Anwendungsdomäne ) der Eingabeaufforderung ausgeführt.Um es extrem zu verallgemeinern,
Process.Start
warten Sie nicht , wenn Sie es in Ihrem C # -Äquivalent verwenden. Das wird es sowieso nicht.quelle