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


39

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

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

62

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

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

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

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

Формат PE не очень хорошо документирован, но этот документ может служить введением: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


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

  0

Спасибо Konrad - отлично :-) 22 фев. 092009-02-22 13:24:33

  0

@Rakesh, вы должен принять его решение, если вам это нравится, его маленький V рядом с ответом. 22 фев. 092009-02-22 13:27:07

  0

@ Олафур, не могли бы вы рассказать мне, каково значение ценности «4» прямо над маленьким V рядом с ответом? 22 фев. 092009-02-22 13:29:21

  0

вот число «голосов» - 4 человека (5 сейчас) проголосовали за этот ответ. 22 фев. 092009-02-22 13:36:16

  0

Что это за «2» рядом с вопросом? 22 фев. 092009-02-22 13:39:15

  0

Существуют ли различия в ссылках на DLL? 22 фев. 092009-02-22 13:40:13

  0

@ Rakesh - Нет сомнений по вашему вопросу 22 фев. 092009-02-22 13:40:39

  0

@SoapBox: см. Обновленный ответ. Адрес не фиксирован, он должен быть рассчитан. Я прочитал ссылку на некоторый код VB6, чтобы прочитать эти данные. В статье MSDN также показано, как это сделать. 22 фев. 092009-02-22 16:15:27

  0

Мой отец просто заменил компоновщик с помощью специальной программы, которая изменила командную строку компоновщика в соответствующем файле, а затем запустила на нем фактический компоновщик. Конечный результат совпадает с переключением байта в исполняемом файле, конечно :) 31 май. 132013-05-31 05:10:53


1

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

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


15

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

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

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


2

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

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

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


1

Сообщение Loop также является одним из разницы:

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


2

Вы можете изменить Subsystem с EDITBIN.exe (MSDN Entry on EDITBIN.exe)