У меня есть вопрос любопытства относительно 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 знает, что он должен оставаться открытым, а не запускать и забывать ConApp? И можно ли вызывать одно и то же поведение в моем WinApp, т.е. Мне не нужно называть "start\wait"?
Примечание:
Я играл с использованием AllocConsole и AttachConsole, однако при использовании AttachConsole (-1) в моем WinApp Cmd все еще запускает и перезапускает WinApp, однако WinApp, похоже, просто открывает новое окно консоли.
Запуск приложения Windows и консольного приложения через Cmd
Ответ 1
Эта информация хранится как часть части PEOptHeader
двоичного формата EXE. В частности, поле Subsystem
сообщает операционной системе, какой тип приложения это и может иметь следующие значения
- 1: Родной
- 2: Windows/GUI
- 3: Windows без GUI
- 5: OS/2
- 7: POSIX
Это то, что сообщает окнам, какой тип программы он и, следовательно, дает возможность делать разные варианты, как это делает cmd.
Ответ 2
Технические детали в стороне (JaredPar сделал действительно хорошую работу для этого), если вы хотите изменить свою программу с Windows/GUI
на Windows non-GUI
все, что вы необходимо выполнить вход в настройки вашего проекта и изменить раскрывающееся меню "Приложение Windows" на "Консольное приложение"
У вас может быть приложение Window, запускаемое как консольное приложение, и оно даст вам поведение, которое вы ожидаете. (обратите внимание, что теперь, если вы дважды щелкните по значку для программы, он откроет окно консоли, которое останется открытым, пока ваша программа открыта.)