Разница между Windows и консольным приложением - PullRequest
48 голосов
/ 22 февраля 2009

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

При создании нового проекта в Visual C ++, он просит выбрать любой из вышеперечисленных.

Ответы [ 6 ]

73 голосов
/ 22 февраля 2009

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

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

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

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

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


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

17 голосов
/ 22 февраля 2009

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

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

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

2 голосов
/ 08 ноября 2012

Подсистему можно изменить с помощью EDITBIN.exe ( Запись MSDN для EDITBIN.exe )

2 голосов
/ 22 февраля 2009

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

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

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

1 голос
/ 05 августа 2010

Цикл сообщений также является одним из отличий:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

1 голос
/ 22 февраля 2009

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

Предустановлено приложение Windows, поэтому вы можете запрограммировать приложение с графическим интерфейсом, которое работает в среде Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...