С помощью инструмента VS мы могли видеть стек вызовов ниже:
И если вы дважды щелкнете по каждому вызову стека, вы сможете увидеть, что он делал в код (как комментарии, исходный код был расположен на ..\VC\Tools\MSVC\14.24.28314\crt\src\vcruntime
).
Первый wWinMainCRTStartup
просто для вызова функции __scrt_common_main
:
extern "C" int wWinMainCRTStartup()
{
return __scrt_common_main();
}
В __scrt_common_main
, комментарии содержат детали:
// This is the common main implementation to which all of the CRT main functions
// delegate (for executables; DLLs are handled separately).
static __forceinline int __cdecl __scrt_common_main()
{
// The /GS security cookie must be initialized before any exception handling
// targeting the current image is registered. No function using exception
// handling can be called in the current image until after this call:
__security_init_cookie();
return __scrt_common_main_seh();
}
Функция является общей основной реализацией, которой делегируются все основные функции CRT (для исполняемых файлов; DLL обрабатываются отдельно) и __security_init_cookie is
для инициализации / Cookie безопасности GS перед обработкой любых исключений для текущего образа.
Затем это было __scrt_common_main_seh
: инициализировать crt, получить блокировку запуска, проверить текущее собственное состояние запуска, снять блокировку запуска, вызвать динамически инициализированные переменные __declspe c (thread), зарегистрируйте функцию обратного вызова для деструкторов, локальных для потока.
После завершения инициализации вызовите invoke_main
, в качестве имени вызывается main
/ wWinMain
.
static int __cdecl invoke_main()
{
return wWinMain(
reinterpret_cast<HINSTANCE>(&__ImageBase),
nullptr,
_get_wide_winmain_command_line(),
__scrt_get_show_window_mode());
}