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, поэтому я надеюсь, что другие, которые более осведомлены, поправят меня, если я ошибаюсь.