c++ - 无法创建主窗口?

标签 c++ mfc

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

Unhandled exception at 0x00E7A9DC in GUI_Employee_0501.exe: 0xC0000005: Access violation reading location 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; 显然没有在您的应用程序中执行。

关于c++ - 无法创建主窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969407/

相关文章:

c++ - 完全重建后奇怪的段错误消失了

C++:如何在类中创建和使用 mysql 连接

visual-c++ - 使用 DT_WORDBREAK 绘制文本 DT_CALCRECT

c++ - Windows 图标 (LoadImage) 句柄的生命周期是多长?

winapi - MFC:使用 CString 加载字符串

c++ - 哪个有更好的内存访问? (C++)

c++ - 使用 zLib 删除无效

c++ - 英特尔 SGX 在老一代英特尔处理器上的开发

c++ - 为什么在 mfc 的 listcontrol 中插入的文本显示截断文本? listcontrol 是重新调整大小?

c++ - 如何在 vc 2008 或 vc 2010 Beta 中将对话框栏或对话框放入 Pane