Как подсказка подскажет, когда ждать выхода?

Я пытался сделать код командной строки Windows на С#. Мне было интересно, как командное окно знает, когда ждать завершения процесса, и когда не ждать выхода вызываемого процесса.

Например, если вы введете командную строку "Блокнот", Notepad запустится, но вы можете выполнить другие команды. Однако, если вы откроете такую ​​утилиту, как more.com, ping.exe или другую утилиту, она будет ждать завершения выполнения программы, прежде чем позволить вам выполнить другую команду.

Как в командной строке известно, когда ждать выхода, и как это поведение можно эмулировать на С#?

Ответ 1

Если приложение является графическим приложением Win32, оно просто запустится, и приглашение командной строки не будет ждать выхода.

Если приложение является консольным приложением, оно будет запущено в командной строке, и вам нужно будет дождаться завершения его, чтобы вернуть командную строку.

EDIT:

OK. Кажется, вам нужно техническое объяснение. Если вы хотите эмулировать одну и ту же функцию в своем приложении, вы можете проверить IMAGE_OPTIONAL_HEADER EXE файлов здесь.

Внутри IMAGE_OPTIONAL_HEADER есть:

 WORD                 Subsystem;

If SubSystem == 0x02 это означает, что это приложение GUI.

If SubSystem == 0x03 Это означает, что это приложение командной строки.

ИЗМЕНИТЬ 2:

Если вы хотите увидеть его в действии:

  • Загрузить http://www.ntcore.com/exsuite.php

  • Скопировать файл calc.exe или notepad.exe на рабочий стол

  • Открыть скопированный файл calc.exe в проводнике CFF

  • Перейдите к заголовкам Nt → Дополнительные заголовки

  • Изменить SubSystem с 0x002 на 0x003

  • Сохранить

Теперь запустите новый модифицированный калькулятор, и вы увидите, что в командной строке ожидается его прекращение.

Ответ 2

По умолчанию из командной строки следует запустить программу GUI в отдельный процесс /fork. Тем не менее, вы можете запустить блокнот (или другую программу GUI) с помощью командной строки/оболочки script:

start /w notepad.exe

Таким образом, командная строка/оболочка script продолжается только после завершения процесса notepad.exe.

Надеюсь, это поможет, TW

Ответ 3

Когда вы запускаете новый процесс, приложение GUI в этом контексте, которое фактически работает за пределами приглашения, приглашение не будет ждать. Но если вы запустите команду, которая полностью работает под границами текущего экземпляра запроса, она ждет.

Итак, команда notepad просто запускает приложение "Блокнот" и оставляет управление приложением. Пока команда ipconfig работает под доменом (это не домен приложения), подсказки.

Чрезвычайно обобщать, когда вы используете Process.Start в своем эквиваленте С#, не ждите. Это все равно не будет.