-1

別のクラスで子ウィンドウを作成しているので、親の hWnd と hInstance を子ウィンドウを作成する関数に渡します。

私の問題は、子ウィンドウのcreateWindow()関数がハングアップし、「例外が発生しました。これは拡張機能が原因である可能性があります」というエラーメッセージが表示されることです。

このメッセージの意味、または私が間違っていることを誰かが知っていますか?

ここでは、ID を持つサブメニューを使用しているため、親ウィンドウのメッセージ ハンドラーで子ウィンドウを呼び出しています。

LRESULT CALLBACK System::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    MainMenu mMainMenu;

    switch (message)
    {
        case WM_COMMAND:
        {
            switch (LOWORD(wparam))
            {
                //If user presses on the exit button
                case IDM_FILE_EXIT:
                {
                    PostQuitMessage(0);
                } break;

                case IDM_NEW_NEWPROJECT:
                {
                    //////////////////////////////////////////////
                    // Here is the error showing up
                    //////////////////////////////////////////////
                    m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);
                }break;


                default:
                    break;
            }
        }

        // Any other messages send to the default message handler as our application won't make use of them.
        default:
        {
            return DefWindowProc(hwnd, message, wparam, lparam);
        }
    }
}

初期化:

bool CreateProjectMenu::Initialize(HWND m_ParentWindow, HINSTANCE m_hParentInstance)
{
    //Initialize the window
    InitializeWindow(m_ParentWindow, m_hParentInstance);

    return true;
}

初期化ウィンドウ:

void CreateProjectMenu::InitializeWindow(HWND m_ParentWindow, HINSTANCE m_hParentInstance)
{
    wc.style = CS_HREDRAW | CS_VREDRAW;                 // Defines additional elements of the window class.
    wc.lpfnWndProc = ChildProc;                         // A pointer to the window procedure.
    wc.cbClsExtra = 0;                                  // The number of extra bytes to allocate following the window-class structure.
    wc.cbWndExtra = 0;                                  // The number of extra bytes to allocate following the window instance.
    wc.hInstance = m_hParentInstance;                   // A handle to the instance that contains the window procedure.
    wc.hIcon = LoadIcon(wc.hInstance, IDI_APPLICATION); // Load the icon for the application.
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);           // Load the cursor for the application.
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      // Load the background for the application.
    wc.lpszMenuName = NULL;                             // Pointer to a character string that specifies the name of the resource class menu.
    wc.lpszClassName = m_ProjectMenuWindowName;         // Set the name for the window.
    wc.hInstance = m_hParentInstance;

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, L"Failed to register the menuprojectwindow", L"Error", MB_OK);
    }

    m_NewProjectHwnd = CreateWindow(NULL,
        m_ProjectMenuWindowName,
        WS_CHILD | WS_VISIBLE | WS_CAPTION
        | WS_SYSMENU | WS_THICKFRAME
        | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        screenWidth, screenHeight,
        m_ParentWindow,
        NULL,
        m_hParentInstance,
        NULL);

    // Check if the hwnd is zero(error)
    // Display a messagebox with a error
    if (m_NewProjectHwnd == 0)
        MessageBox(NULL, L"Could not create the create project hwnd.", L"Error", MB_OK);    
    else
    {
        ShowWindow(m_NewProjectHwnd, SW_SHOW);  // Bring the window up on the screen
        SetFocus(m_NewProjectHwnd);
    }

    return;
}

エラーを再現するコードは次のとおりです: https://ufile.io/ddmj4

4

1 に答える 1