无法创建主窗口

Cannot create main window?

本文关键字:窗口 创建      更新时间:2023-10-16

我试图用C++制作一个简单的MFC GUI应用程序,但在生成主窗口(对话框?)时似乎遇到了问题。当我试图编译代码时,显示以下消息:

GUI_Employee_0501.exe中0x00E7A9DC处出现未处理的异常:0xC0000005:读取位置0xFEFEFF66时发生访问冲突。

断点停止在winmain.cpp内,位于pThread->m_pMainWnd->DestroyWindow()pThread->m_pMainWnd的值为NULL,我怀疑这是问题的原因。

你能具体说明这里的问题是什么吗?我有一个示例代码,它和我的非常相似,但它很有效,所以我真的不知道发生了什么!

#include <afxwin.h>
#include "resource.h"
#include <iostream>
using namespace std;
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
CEdit *pFNAME;
CEdit *pLNAME;
CEdit *pSALARY;
CEdit *pDDAY;
CEdit *pMMONTH;
CEdit *pYYEAR;
CComboBox *pGENDER;
CButton *pADD;
CButton *pDELETE;
CButton *pSAVE;
CButton *pLOAD;
class ENTRY_FORM : public CDialog
{
public:
    ENTRY_FORM(CWnd* pParent = NULL) : CDialog(ENTRY_FORM::IDD, pParent) { }
    enum { IDD = dialog_main };
protected:
    virtual void DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
    virtual BOOL OnInitDialog()
    {
        CDialog::OnInitDialog();
        SetUpInterfacePointers();
        return true;
    }
    void SetUpInterfacePointers(){ ... does its own thing ... }
public:
    afx_msg void add() { PRESS_ADD(); }
    void PRESS_ADD() { ... does its own thing ... }
    DECLARE_MESSAGE_MAP()
};
class Program : public CWinApp
{
public:
    Program(){ }
public:
    virtual BOOL InitInstance()
    {
        CWinApp::InitInstance();
        cout << "CWinAPP:initInstance" << endl;
        ENTRY_FORM dlg;
        m_pMainWnd = &dlg;                  
        cout << "mpMainWnd" << endl;
        INT_PTR nResponse = dlg.DoModal();  
        return FALSE;
    }
};
//
BEGIN_MESSAGE_MAP(ENTRY_FORM, CDialog)
    ON_COMMAND(button_add, add)
END_MESSAGE_MAP()
//
Program theApp;

InitInstance():的变化

return FALSE;

return TRUE;

这是因为CWinApp::InitInstance应该只在失败的情况下返回FALSE,如果所有初始化都正常,则返回TRUE。如果失败,AfxWinMain将尝试销毁m_pMainWnd指向的窗口,这是不可能的(这会导致Undefined Behavior),因为您为m_pMainWnd分配了一个本地对象(一旦InitInstance结束,就会销毁该对象)。

[编辑]

S。B Bae-为了进一步调查并找到根本原因,您需要调试对话框结束后m_pMainWnd应设置为NULL的位置。这应该在wincore.cpp的CWnd::OnNcDestroy()中。有一行pThread->m_pMainWnd = NULL;显然没有在您的应用程序中执行。

聚会迟到了,但我在创建MFC对话框应用程序时发现了确切的问题。我发现我意外地将应用程序对话框样式(在属性中)从"Popup"更改为"Child"。切换此项可以始终切换此错误。"重叠"似乎和"弹出"一样有效。

https://learn.microsoft.com/en-us/cpp/mfc/reference/styles-used-by-mfc?view=vs-2019#窗口样式