无法创建主窗口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法创建主窗口?相关的知识,希望对你有一定的参考价值。

我试图用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指向的窗口,这是不可能的(它导致未定义的行为),因为您为m_pMainWnd分配了一个本地对象(一旦InitInstance结束就被销毁)。

[编辑]

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

另一答案

晚了,但我在创建MFC Dialog应用程序时看到了确切的问题。我发现我不小心将应用程序对话框Style(在属性中)从'Popup'更改为'Child'。切换此可以始终切换此错误。 'Overlapped'似乎和'Popup'一样好用。

https://docs.microsoft.com/en-us/cpp/mfc/reference/styles-used-by-mfc?view=vs-2019#window-styles

以上是关于无法创建主窗口?的主要内容,如果未能解决你的问题,请参考以下文章

无法在片段内创建对话框

在创建主窗口后添加 NSTouchBar 支持

PyCharm PyQt5创建主窗口源代码

MFC非模态添加进程控件方法一(线程方法)

JavaFX窗口拖动

MFC怎么在主窗口显示后,加载子窗口