2014-01-07 4 views
12

У меня есть вопрос любопытства относительно Console vs Windows Application при запуске приложения из Cmd, вызывающего exe напрямую.
Если приложение скомпилировано как консольное приложение (будет ссылаться на него как на мой ConApp), при запуске приложения через cmd запрос ожидает завершения работы приложения, прежде чем продолжить. Однако, если приложение было скомпилировано в качестве приложения Windows (будет ссылаться на него как на мой WinApp), начиная приложение с помощью cmd в командной строке будет запущено и забыто WinApp, понятно, что это ожидаемое поведение.
Чтобы получить WinApp, чтобы остановить cmd от увольнения и забывания, нужно было бы запустить приложение в cmd с чем-то вроде «start \ wait WinApp.exe», это заставит приглашение Cmd ждать WinApp, чтобы остановить работу перед продолжением.
Мой вопрос вокруг этого заключается в том, как Console Application сообщает Cmd, или как Cmd знает, что он должен оставаться открытым, а не fire-and-forget ConApp? И можно ли вызывать одно и то же поведение в моем WinApp, т. Е. Мне не нужно называть «start \ wait»?

Примечание:
я играл с использованием AllocConsole и AttachConsole, однако при использовании AttachConsole (-1) в моем WinApp ЦМД до сих пор выстрелил и забывает WinApp однако WinApp кажется просто открыть новое окно консоли.Запуск приложения Windows и консольного приложения через Cmd

+0

Вы заинтересованы в технических деталях или как изменить свою программу от огня и забыл режима в режим ждать? –

+1

Выполняет ли исполняемый файл приложение в режиме консоли или собственное приложение Windows в заголовке EXE-файла. Cmd.exe смотрит на это, чтобы знать, что делать. Это не поможет вам ничего решить. –

ответ

7

Эта информация хранится как часть части двоичного формата EXE в формате PEOptHeader. В частности, Subsystem поле указывает операционной системе, какой тип приложения это и может иметь следующие значения

  • 1: Native
  • 2: Windows/GUI
  • 3: Windows не-GUI
  • 5 : OS/2
  • 7: POSIX

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

Documentation Link

3

Технические детали в стороне (JaredPar did a really good job of doing that), если вы хотите изменить свою программу из режима Windows/GUI в Windows non-GUI все, что вам нужно сделать, это зайти в свою настройку проекта и измените раскрывающийся от «приложения Windows, "в„Console Application“

enter image description here

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

enter image description here

Смежные вопросы