Два окна WinMain в двух потоках std::thread

Подскажите пожалуйста, почему не создаются два окна.

Вот простой код:

Создаю отдельную функцию my_func_win_main, в которой создаю поток и в потоке вызываю стандартную функцию создания окна.

И далее из main вызываю первый функцию my_func_win_main() - создается окно, все классно.

И второй раз вызывается функция my_func_win_main() - а вот при втором вызове, второго окна не создаётся. Но я не могу понять почему.

PS: Как видно, main() не завершается после вызова двух функций, а спит в ожидании, когда создастся второе окно, но оно не создается.

#include <iostream>
#include <windows.h>
#include <string>
#include <Windowsx.h>
#include <vector>
#include <thread>

static LRESULT CALLBACK WndProc2(HWND   hWnd, UINT   message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;


    if (message == WM_PAINT)
    {
        HDC my_hdc = BeginPaint(hWnd, &ps); 


        EndPaint(hWnd, &ps); 
    }



    if (message == WM_LBUTTONDOWN)
    {
        std::cout << "WM_LBUTTONDOWN" << std::endl;
    }
    if (message == WM_LBUTTONUP)
    {
        std::cout << "WM_LBUTTONUP" << std::endl;
    }
    if (message == WM_LBUTTONDBLCLK)
    {
        std::cout << "WM_LBUTTONDBLCLK" << std::endl;
    }




    if (message == WM_CLOSE) 
    {
        DestroyWindow(hWnd);  
    }

    if (message == WM_DESTROY)  
    {
        PostQuitMessage(0);
    }


    return DefWindowProc(hWnd, message, wParam, lParam); 


}





std::string My_create_window_()
{


    HINSTANCE hInstance = GetModuleHandleA(NULL); 

    if (hInstance == NULL)
    {
        return "GetModuleHandleA == NULL:" + std::to_string(GetLastError());
        std::cout << "error" << std::endl;
    }

    //-----------------------------------------------------------


    ///////////////////////////////////////////////////////
    WNDCLASSEX My_WNDCLASSEX;      

    wchar_t My_lpszClassName[] = L"My_Clas_Windows";

    My_WNDCLASSEX.cbSize = sizeof(WNDCLASSEX);       
    My_WNDCLASSEX.style = CS_HREDRAW | CS_VREDRAW;   
    My_WNDCLASSEX.lpfnWndProc = WndProc2;             
    My_WNDCLASSEX.cbClsExtra = 0;                    
    My_WNDCLASSEX.cbWndExtra = 0;                    
    My_WNDCLASSEX.hInstance = hInstance;            
    My_WNDCLASSEX.hIcon = LoadIcon(hInstance, IDI_APPLICATION);   
    My_WNDCLASSEX.hCursor = LoadCursor(NULL, IDC_ARROW);          
    My_WNDCLASSEX.hbrBackground = (HBRUSH)(COLOR_WINDOW + 0);     
    My_WNDCLASSEX.lpszMenuName = NULL;                        
    My_WNDCLASSEX.lpszClassName = L"My_Clas_Windows";                    
    My_WNDCLASSEX.hIconSm = LoadIcon(My_WNDCLASSEX.hInstance, IDI_APPLICATION);  
        ///////////////////////////////////////////////////////



    int result_RegisterClassEx = RegisterClassEx(&My_WNDCLASSEX);  



    /////////////////////////////////////////////////////
    if (result_RegisterClassEx == 0)  
    {
        return "Error: RegisterClassEx == 0:" + std::to_string(GetLastError());
        std::cout << "error" << std::endl;
    }
    /////////////////////////////////////////////////////



    /////////////////////////////////////////////////////
     //Функция создания окна
    HWND hWnd = CreateWindow(
        My_WNDCLASSEX.lpszClassName,                    
        L"My_main_window东",                                     
        WS_OVERLAPPEDWINDOW,                             
        255,                                            
        0,                                             
        1000,                                             
        500,                                            
        NULL,                                            
        NULL,                                            
        My_WNDCLASSEX.hInstance,                         
        NULL                                             
    );
    /////////////////////////////////////////////////////

    if (hWnd == INVALID_HANDLE_VALUE) 
    {
        return "Error: CreateWindow == INVALID_HANDLE_VALUE:" + std::to_string(GetLastError());
        std::cout << "error" << std::endl;
    }

    //-------------------------------------------------------------------------------------------------


    ///////////////////////////////////
    ShowWindow(hWnd,                          
        SW_SHOWDEFAULT);  //nCmdShow             
    UpdateWindow(hWnd);
    ///////////////////////////////////






    ////////////////////////////////////////
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))  
    {
        TranslateMessage(&msg);   
        DispatchMessage(&msg);    
    }
    ////////////////////////////////////////


    return std::to_string((int)msg.wParam);

}













void my_func_win_main()
{

my_thread(My_create_window_);
    my_thread.detach();


}

main.cpp

int main()
{
 
my_func_win_main();
 
my_func_win_main();

    Sleep(50000);
 
}

Ответы (1 шт):

Автор решения: user7860670

Попытка повторно зарегистрировать оконный класс с тем же именем, пока предыдущий еще жив, обречена на провал.

Тем более, что потом идет изящная конструкция

 if (result_RegisterClassEx == 0)  
    {
        return "Error: RegisterClassEx == 0:" + std::to_string(GetLastError());
        std::cout << "error" << std::endl;
    }

возвращающая бесхозную строку и содержащая недостижимую печать в cout

→ Ссылка