2013-09-10 3 views
2

Я довольно новичок в C++, но раньше делал некоторое .NET-программирование.WinMain vs. main (C++)

В чем разница между main(...) и WinMain(...), я написал программу раньше с main(...) и был в состоянии вызывать функции Win32 просто отлично, как я с WinMain(...), так что это заставляет меня спросить «, где было бы лучше использовать один с другой, или это даже имеет значение? "

+4

В общем, 'WinMain()' предназначен для приложений с графическим интерфейсом, 'main()' предназначен для консольных приложений. –

ответ

13

Говоря о инструментарии, Microsoft, обычно, Win32 графических приложения всегда начало с WinMain, в то время как main используется для консоли приложений.

Разница между двумя типами приложений фактически сводится (в основном) к одному параметру в исполняемом файле и не находится в возможности - приложение GUI может создавать консоль, а консольное приложение может создавать окно - но в поведении загрузчика: для exe, помеченного как GUI, загрузчик не будет выделять какую-либо консоль, тогда как консоль exe будет прикрепляться к консоли родителя или создавать новую, если ее нет.

Для названия точки входа все это просто вопрос компоновщика/CRT по умолчанию: «реальная» точка входа исполняемого файла представляет собой просто смещение в конечном исполняемом файле, которое указывает на функцию, которая не принимает никаких параметров. Это CRT, который делает свой материал, определяет параметры, а затем называет «вашу» точку входа, поэтому в принципе они оба могут работать точно так же.

Дело в том, что имя/подпись точки входа по умолчанию, которую ищет CRT, зависит от типа используемого приложения; если компилятор и компоновщик настроены на создание консольного приложения, они будут искать main (или wmain или _tmain, в зависимости от настроек Юникода), для приложения с графическим интерфейсом они используют WinMain и DllMain для dll.


Итак:

  • использование WinMain если вы строите GUI (= нет консоли для него создается при запуске) заявление;
  • main для консольного приложения;
  • DllMain для dll.

Опять же, все это не написано в камне (и есть способы запуска приложения с графическим интерфейсом от стандартного main), но «когда в Риме, делай, как римляне делают» - то есть, как правило, лучше всего следуйте за использованием платформы, чтобы избежать путаницы с другими разработчиками и пройти через непроверенные/неподдерживаемые параметры компилятора, чтобы изменить подпись точки входа.

1

WinMain() - это конкретная точка входа Windows в графическое приложение на базе Windows (у вас есть материалы для Windows). main() - стандартная точка входа C++ (в Windows это приложение на основе консоли).

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

Я бы рекомендовал читать по consoles и GUI applications в Windows на MSDN.

+0

Это только по традиции, ничто не останавливает консольное приложение от создания графического интерфейса, и нет ничего, что остановило бы приложение GUI от создания консоли (как упоминалось в ответе Matteo Italia). – dreamlax

+1

@dreamlax И я цитирую: «_That сказал, вы можете использовать материал GUI в консольных приложениях и выделять консоль в приложениях с графическим интерфейсом.» – lapk

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