WINMAIN и main() в C++ (расширенный)
правильно, я посмотрел на этот пост:разница между WinMain, main и DllMain в C++
теперь я знаю, что WINMAIN
используется для оконных приложений и main()
для консолей. Но чтение поста на самом деле не говорит мне, почему именно в чем разница.
Я имею в виду, в чем смысл разделения различных функций сети для запуска программы? Это из-за проблем с производительностью? Или что это?
4 ответов
о функции.
стандарты C и c++ требуют, чтобы любая программа (для" размещенной " реализации C или c++) имела функцию main
, который служит в качестве программы функции запуска. The main
функция вызывается после ноль-инициализации нелокальных статических переменных и, возможно, но не обязательно (! В C++11 §3.6.2/4) этот вызов происходит после того, как динамическая инициализация таких переменных. Он может иметь одна из следующих подписей:
int main()
int main( int argc, char* argv[] )
плюс возможная реализация-определено подписей (в C++11 §3.6.1/2) за исключением того, что тип результата должен быть int
.
как единственная такая функция в C++ main
есть результате по умолчанию значение, а именно 0. Если main
возвращает после обычной функции return exit
С main
значение результата в качестве аргумента. Стандарт определяет три значения, которые гарантированно могут быть использованы: 0 (указывает, успех),EXIT_SUCCESS
(также указывает на успех, и обычно определяется как 0), а EXIT_FAILURE
(указывает на сбой), где две именованные константы определяются <stdlib.h>
заголовок, который также объявляет (LPSTR
это просто char*
).
Аргументы:
the
hInstance
значение аргумента является базовым адресом образа памяти исполняемого файла, он в основном используется для загрузки ресурсов из исполняемого файла, и его можно также получить изGetModuleHandle
функции API,-
the . Один из способов представить текст окна консоли из программы подсистемы GUI-перенаправить стандартный выходной поток. Другой способ заключается в явном создании окна консоли из кода программы.
подсистема программы закодирована в заголовке исполняемого файла. Он не отображается проводником Windows (за исключением того, что в Windows 9x можно "быстро просмотреть" исполняемый файл, который представил примерно ту же информацию, что и Microsoft сейчас). Нет соответствующей концепции C++.
main
С GNU toolchain и.[D:\dev\test] > g++ foo.cpp [D:\dev\test] > objdump -x a.exe | find /i "subsys" MajorSubsystemVersion 4 MinorSubsystemVersion 0 Subsystem 00000003 (Windows CUI) [544](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000004 __major_subsystem_version__ [612](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000003 __subsystem__ [636](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __minor_subsystem_version__ [D:\dev\test] > g++ foo.cpp -mwindows [D:\dev\test] > objdump -x a.exe | find /i "subsys" MajorSubsystemVersion 4 MinorSubsystemVersion 0 Subsystem 00000002 (Windows GUI) [544](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000004 __major_subsystem_version__ [612](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000002 __subsystem__ [636](sec -1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __minor_subsystem_version__ [D:\dev\test] > _
main
С Microsoft набор инструментов:[D:\dev\test] > set LINK=/entry:mainCRTStartup [D:\dev\test] > cl foo.cpp user32.lib foo.cpp [D:\dev\test] > dumpbin /headers foo.exe | find /i "subsys" 6.00 subsystem version 3 subsystem (Windows CUI) [D:\dev\test] > cl foo.cpp /link user32.lib /subsystem:windows foo.cpp [D:\dev\test] > dumpbin /headers foo.exe | find /i "subsys" 6.00 subsystem version 2 subsystem (Windows GUI) [D:\dev\test] > _
примеры использования Microsoft
согласно @RaymondChen
имя WinMain-это просто соглашение
хотя функция WinMain документирована в SDK платформы, это не совсем часть платформы. Скорее, WinMain является обычным имя предоставленной пользователем точки входа в программу Windows.
реальная точка входа находится в библиотеке времени выполнения C, которая инициализирует среда выполнения запускает глобальные конструкторы, а затем вызывает Функции WinMain функция (или wWinMain, если вы предпочитаете точку входа Unicode).
DllMain и WinMain отличаются своими прототипами. WinMain принимает аргумент командной строки, в то время как другой говорит о том, как он подключен к процессу.
по состоянию на документация MSDN
по умолчанию начальным адресом является имя функции из библиотеки времени выполнения C. Компоновщик выбирает его в соответствии с атрибутами программы, как показано в следующей таблице.
mainCRTStartup
(илиwmainCRTStartup
) приложение, использующее/SUBSYSTEM:CONSOLE;
вызовы main (илиwmain
)WinMainCRTStartup
(илиwWinMainCRTStartup
) приложение, использующее/SUBSYSTEM:WINDOWS;
звонкиWinMain
(илиwWinMain
), которые должны быть определяется с помощью__stdcall
_DllMainCRTStartup
DLL; вызовыDllMain
, который должен быть определен с__stdcall
, если он существует
стандартная программа C передается 2 параметрами командной строки при запуске:
int main( int argc, char** argv ) ;
-
char** argv
представляет собой массив строк (char*
) -
int argc
числоchar*
в argv
загрузки функция WinMain
то, что программисты должны писать для программы windows, немного отличается. WinMain
принимает 4 параметра, которые передаются в программу Win O / S при запуске:
int WINAPI WinMain( HINSTANCE hInstance, // HANDLE TO AN INSTANCE. This is the "handle" to YOUR PROGRAM ITSELF.
HINSTANCE hPrevInstance,// USELESS on modern windows (totally ignore hPrevInstance)
LPSTR szCmdLine, // Command line arguments. similar to argv in standard C programs
int iCmdShow ) // Start window maximized, minimized, etc.
смотри мою статью как создать базовое окно в C дополнительные
Я смутно припоминаю, что где-то читал, что программы Windows имеют . Он просто спрятан где-то в заголовке или библиотеке. Я верю этому main()
функция инициализирует все переменные, необходимые WinMain()
а затем вызывает его.
конечно, я WinAPI noob, поэтому я надеюсь, что другие, которые более осведомлены, поправят меня, если я ошибаюсь.