我尝试用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;
答案 0 :(得分:2)
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;
显然没有在您的应用程序中执行。
答案 1 :(得分:0)
晚些时候参加聚会,但是在创建MFC Dialog应用程序时我看到了确切的问题。我发现我不小心将应用程序对话框的样式(在属性中)从“弹出”更改为“子”。切换此选项可以始终切换此错误。 “重叠”似乎和“弹出”效果一样。
https://docs.microsoft.com/en-us/cpp/mfc/reference/styles-used-by-mfc?view=vs-2019#window-styles