Подтвердить что ты не робот

Разница между Windows и консольным приложением

Какие отличия между Windows и консольными приложениями?

При создании нового проекта в Visual С++ он просит выбрать один из указанных выше.

4b9b3361

Ответ 1

Единственное отличие заключается в том, что консольное приложение всегда создает консоль, если она не запускается с одного (или консоль активно отключается при запуске). С другой стороны, приложение Windows не создает консоль. Он все равно может прикрепляться к существующей консоли или создавать новый с помощью AllocConsole.

Это делает приложения Windows лучше подходящими для приложений GUI или фоновых приложений, потому что вы обычно не хотите, чтобы для них создано окно терминала.

В более техническом примечании единственная разница между консолью и исполняемым файлом Windows - один байт в PE-заголовке файла exe. Переключение этого байта вручную (например, с использованием шестнадцатеричного редактора) преобразует тип приложения. Это хорошо опубликованный хак, который используется для создания консольных приложений в VB6 (где этот тип приложений явно не поддерживается).

Чтобы определить и изменить тип подсистемы приложения, вам необходимо прочитать части заголовка PE. Адрес данных подсистемы не исправлен, поскольку он является частью дополнительного заголовка файла, позиция которого определяется адресом, хранящимся в заголовке файла DOS (в элементе e_lfanew). Этот адрес фактически указывает на запись _IMAGE_NT_HEADERS, которая, в свою очередь, включает структуру IMAGE_OPTIONAL_HEADER32. У этого есть член int16 1) называемый Subsystem. Значение члена равно 2 для приложения Windows и 3 для консольного приложения. Существуют и другие подсистемы (в частности, POSIX и ядро). Я написал небольшое приложение VB6 для изменения подсистемы приложения, которое можно загрузить из ActiveVB в качестве исходного кода.

Формат PE не очень хорошо документирован, но этот документ может служить введением: Peering Inside PE: обзор формата исполняемого файла Win32 Portable.


1) Это не противоречит моему утверждению, что только один байт отличается: самый старший байт этого элемента всегда равен 0. Изменяется только младший значащий байт.

Ответ 2

Помимо различий, отмеченных Konrad, консольные приложения и приложения Windows ведут себя по-разному, когда они вызываются в интерактивном режиме из командной строки:

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

Это не относится к пакетным файлам; они всегда будут ждать выхода приложения. (Вы всегда можете использовать команду start для запуска приложения без ожидания.)

Ответ 3

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

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

Что касается кишки приложения, то они, по сути, одинаковы. Основное различие добавляется на этапе компиляции.

Ответ 5

Консольное приложение запускается из командной строки Windows (start/run/cmd)

Приложение Window настроено таким образом, что вы можете запрограммировать приложение GUI, которое выполняется в среде Windows.