Я пытался перекодировать командную строку Windows на C #. Мне было интересно, как командная строка знает, когда ждать завершения процесса, а когда не ждать завершения вызываемого процесса.
Например, если вы введете в командной строке «блокнот», Блокнот запустится, но вы все равно сможете выполнять другие команды. Однако, если вы откроете такую утилиту, как more.com, ping.exe или другую утилиту, она будет ждать завершения выполняющейся программы, прежде чем позволить вам выполнить другую команду.
Как командная строка узнает, когда ждать выхода, и как можно эмулировать это поведение в C #?
c#
windows
command-prompt
Джастин Крейча
источник
источник
Ответы:
Если приложение представляет собой приложение с графическим интерфейсом Win32, оно просто запустится, а командная строка не будет ждать его выхода.
Если приложение является консольным, оно будет запускаться в командной строке, и вам нужно будет дождаться его завершения, чтобы вернуть командную строку.
РЕДАКТИРОВАТЬ:
ОК. Похоже, вам нужно техническое объяснение. Если вы хотите эмулировать ту же функцию в своем приложении, вы можете проверить
IMAGE_OPTIONAL_HEADER
EXE-файлы здесь .Внутри
IMAGE_OPTIONAL_HEADER
есть:If SubSystem == 0x02
это означает, что это приложение с графическим интерфейсом.If SubSystem == 0x03
это означает, что это приложение командной строки.РЕДАКТИРОВАТЬ 2:
Если вы хотите увидеть это в действии:
Загрузите http://www.ntcore.com/exsuite.php
Скопируйте calc.exe или notepad.exe на рабочий стол
Откройте скопированный файл calc.exe в CFF Explorer
Перейдите к заголовкам Nt -> Дополнительные заголовки
Измените подсистему с 0x002 на 0x003
Сохрани это
Теперь запустите новый измененный calc, и вы увидите, что командная строка ожидает завершения работы.
источник
По умолчанию из командной строки программа с графическим интерфейсом запускается в отдельном процессе / вилке. Тем не менее, вы можете запустить блокнот (или другую программу с графическим интерфейсом) прямо в командной строке / сценарии оболочки:
Таким образом, командная строка / сценарий оболочки продолжаются только после завершения процесса notepad.exe.
Надеюсь, это поможет, TW
источник
Когда вы запускаете новый процесс, приложение с графическим интерфейсом пользователя в этом контексте, которое фактически работает за пределами границ приглашения, приглашение не будет ждать. Но если вы запустите команду, которая полностью работает в рамках текущего экземпляра приглашения, она ждет.
Итак, команда
notepad
просто запускает приложение «Блокнот» и оставляет управление приложением. В то время как командаipconfig
выполняется в домене (нет, это не домен приложения ) приглашения.В общем, когда вы используете
Process.Start
в своем эквиваленте C #, не ждите. Все равно не будет.источник