Win32 CreateWindow()错误,这是nullptr

时间:2017-09-29 19:38:35

标签: c++ winapi nullptr createwindow

我正在另一个类中创建一个子窗口,所以我将父进程的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;
}

InitializeWindow:

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

1 个答案:

答案 0 :(得分:-1)

this是每个非静态类方法的隐式第一个参数。它是指向调用该方法的对象的指针。您获得的错误消息表示您已在nullptr上调用了方法。虽然您的代码不完整,但唯一可能发生的行是

m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);

您可以使用调试程序在调用之前检查m_CreatePorjectMenu的值,或者添加assert(CreatePorjectMenu);来验证这一点。对于后者,请确保您正在编译启用断言。

至于如何解决它,我无法在不知道你的项目结构的情况下讲述。某些函数必须负责初始化该对象,并且必须确保在回调之前调用它。或者,如果初始化程序模式因任何原因无效,则回调可以检查nullptr并在必要时创建对象。

相关问题