Что такое invoke_main и mainCRTStartup? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть приложение на основе CUI и GUI, написанное на языке CPP. Приложение на основе GUI имеет следующий код:

#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const TCHAR* title = TEXT("پیام");
    const TCHAR* text = TEXT("سلام، من یک پنجره هستم.");

    MessageBox(NULL, text, title, MB_OKCANCEL | MB_ICONINFORMATION);


    return 0;
}

, а программа на основе CUI имеет следующий код:

#include <Windows.h>
#include <iostream>

int main(int argc, const char* argv)
{
    const char* cMessage = "Native Windows Development.\n";
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), cMessage, strlen(cMessage), NULL, NULL);

    return 0;
}

Однако, когда я отлаживал эти программы в WinDBG, я видел до функции main и WinMain были вызваны многие другие функции, такие как mainCRTStartup и invoke_main для приложения на основе CUI, а также WinMainCRTStartup и invoke_main для приложения на основе GUI.

Что это за функции и чем они занимались до выполнения основного? а также как я могу получить больше информации об этих двух функциях?

1 Ответ

0 голосов
/ 09 марта 2020

С помощью инструмента VS мы могли видеть стек вызовов ниже: enter image description here

И если вы дважды щелкнете по каждому вызову стека, вы сможете увидеть, что он делал в код (как комментарии, исходный код был расположен на ..\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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...