C++ MFC对话框成员变量的随机崩溃不在范围内
我有一个带有属性窗口的MFC应用程序。I属性窗口我已经实现了一个定制的CMFCPropertyGridProperty,这样每当用户单击添加到该属性中的按钮时,就会弹出另一个对话框C++ MFC对话框成员变量的随机崩溃不在范围内,c++,mfc,dialog,scope,C++,Mfc,Dialog,Scope,我有一个带有属性窗口的MFC应用程序。I属性窗口我已经实现了一个定制的CMFCPropertyGridProperty,这样每当用户单击添加到该属性中的按钮时,就会弹出另一个对话框 void CMFCPropertyGridCustomProperty::OnClickButton(CPoint point) { CSampleDlg* configDlg = new CSampleDlg(NULL); INT_PTR bR
void CMFCPropertyGridCustomProperty::OnClickButton(CPoint point) {
CSampleDlg* configDlg = new CSampleDlg(NULL);
INT_PTR bResult = configDlg->DoModal();
if(bResult != 1) //If user cancels bResult is 2 ,if select ok bResult is 1
{
return;
}
CString selectedOutput = configDlg->GetSelectionOutput();
CString configValue = configDlg->GetSelectionElemValue();
但问题是,当我在调试模式下运行时,有时它工作正常,但有时在configDlg->GetSelectionOutput()行上崩溃。在callStack中,我发现变量当时超出了范围
以下是我的部分对话框代码:
IMPLEMENT_DYNAMIC(CSomeClassDlg, CDialogEx)
CSomeClassDlg::CSomeClassDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSomeClassDlg::IDD, pParent)
{
m_DevNameStr = "";
m_ElemValue = "";
}
CSomeClassDlg::~CSomeClassDlg()
{
delete m_DataXMLTree;
m_DataXMLTree = NULL;
delete m_TemplateXMLTree;
m_TemplateXMLTree = NULL;
}
void CSomeClassDlg::OnItemchangedElementList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nPos = -1;
nPos = m_ElementListCtrl.GetNextItem(-1,LVNI_SELECTED);
if(nPos != -1)
{
elemDataNode = (CTreeNode*)(m_ElementListCtrl.GetItemData(nSelectedItemIndex));
elemTepmplateNode = GetTemplateElement(elemDataNode);
ShowElemDescription(elemDataNode,elemTepmplateNode);
}
else
{
return;
}
*pResult = 0;
}
void CSomeClassDlg::ShowElemDescription(CTreeNode* dataElemNode, CTreeNode* templateElemNode)
{
if(dataElemNode==NULL || templateElemNode==NULL)
{
m_DescEditCtrl.SetWindowTextA("");
return;
}
CString PIXITStr = templateElemNode->GetAttributeValue("AssociatedPixit");
CString descriptionStr = templateElemNode->GetAttributeValue("Description");
CString valueStr = dataElemNode->GetAttributeValue("Value");
m_DescEditCtrl.SetWindowTextA(descriptionStr);
m_DevNameStr = PIXITStr;
m_ElemValue = valueStr;
}
CString CSomeClassDlg::GetSelectionOutput()
{
return m_DevNameStr;
}
CString CSomeClassDlg::GetSelectionElemValue()
{
return m_ElemValue;
}
IMPLEMENT\u DYNAMIC(CSomeClassDlg、CDialogEx)
CSomeClassDlg::CSomeClassDlg(CWnd*pParent/*=NULL*/)
:CDialogEx(CSomeClassDlg::IDD,pParent)
{
m_DevNameStr=“”;
m_ElemValue=“”;
}
CSomeClassDlg::~CSomeClassDlg()
{
删除m_DataXMLTree;
m_DataXMLTree=NULL;
删除m_TemplateXMLTree;
m_TemplateXMLTree=NULL;
}
void CSomeClassDlg::OnItemchangedElementList(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMLISTVIEW pNMLV=重新解释铸件(pNMHDR);
int nPos=-1;
nPos=m_ElementListCtrl.GetNextItem(-1,已选择LVNI_);
如果(NPO!=-1)
{
elemDataNode=(CtreNode*)(m_ElementListCtrl.GetItemData(NselectEditedIndex));
ElemTemplateNode=GetTemplateElement(elemDataNode);
ShowElemDescription(elemDataNode、ElemTemplateNode);
}
其他的
{
回来
}
*预设值=0;
}
void CSomeClassDlg::ShowElemDescription(CTreeNode*dataElemNode,CTreeNode*templateElemNode)
{
if(dataElemNode==NULL | | templateElemNode==NULL)
{
m_DescEditCtrl.SetWindowTextA(“”);
回来
}
CString PIXITStr=templateElemNode->GetAttributeValue(“AssociatedPixit”);
CString descriptionStr=templateElemNode->GetAttributeValue(“Description”);
CString valueStr=dataElemNode->GetAttributeValue(“值”);
m_DescEditCtrl.SetWindowTextA(descriptionStr);
m_DevNameStr=PIXITStr;
m_ElemValue=valueStr;
}
CString CSomeClassDlg::GetSelectionOutput()
{
返回m_DevNameStr;
}
CString CSomeClassDlg::getSelectionElementValue()
{
返回m_ElemValue;
}
但我不明白这是否是问题所在,为什么每次都没有发生。如果问题真的存在,那么在执行doModal()之后,获取多成员变量的最佳wat是什么。请帮忙。最后,我做了一些修改,解决了这个问题。 1.更改自定义CMFCPropertyGridProperty类的构造函数,特别是COleVariant类型的参数。 2.将对话框类构造函数更改为采用CtreNode*并将其存储为成员变量。不知何故,在DoModal之后,指针被损坏了。 3.在自定义CMFCPropertyGridProperty类的onclickbutton()中添加了一些Assert()以检查有效性,并添加了一个Redraw()。 我不知道所有这些变化的确切原因。在中找到引用代码 以下是自定义CMFCPropertyGridProperty类的onClick按钮:
void CMFCPropertyGridPropertyCustomClass::OnClickButton(CPoint point)
{
ASSERT_VALID(this);
ASSERT_VALID(m_pWndList);
ASSERT_VALID(m_pWndInPlace);
ASSERT(::IsWindow(m_pWndInPlace->GetSafeHwnd()));
m_bButtonIsDown = TRUE;
Redraw();
BOOL bUpdate = FALSE;
CString selOutput = "";
CSomeClassDlg* configDlg = new CSomeClassDlg(m_selNode);
INT_PTR bResult = configDlg->DoModal();
if(bResult == IDOK)
{
bUpdate = TRUE;
//Do Something
}
if (bUpdate)
{
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetWindowText(selOutput);
}
m_varValue = (LPCTSTR) selOutput;
}
m_bButtonIsDown = FALSE;
Redraw();
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetFocus();
}
else
{
m_pWndList->SetFocus();
}
}
CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description)
{
//some initialization
}
以下是自定义CMFCPropertyGridProperty类的构造函数:
void CMFCPropertyGridPropertyCustomClass::OnClickButton(CPoint point)
{
ASSERT_VALID(this);
ASSERT_VALID(m_pWndList);
ASSERT_VALID(m_pWndInPlace);
ASSERT(::IsWindow(m_pWndInPlace->GetSafeHwnd()));
m_bButtonIsDown = TRUE;
Redraw();
BOOL bUpdate = FALSE;
CString selOutput = "";
CSomeClassDlg* configDlg = new CSomeClassDlg(m_selNode);
INT_PTR bResult = configDlg->DoModal();
if(bResult == IDOK)
{
bUpdate = TRUE;
//Do Something
}
if (bUpdate)
{
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetWindowText(selOutput);
}
m_varValue = (LPCTSTR) selOutput;
}
m_bButtonIsDown = FALSE;
Redraw();
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetFocus();
}
else
{
m_pWndList->SetFocus();
}
}
CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description)
{
//some initialization
}
这样做应该没有问题,所以问题在于对话框的代码。“随机”问题通常表示未初始化的变量。@molbdnilo,在构造函数中,我已将其初始化为“”。还是解决不了。实际上,该变量存储listctrl中选择的字段,并生成字符串并将其存储为meber变量。我甚至在OnClickOK函数中设置了断点。该值仍然可以在那里访问。但在do模式完成后,会发生这种随机崩溃。我能告诉你如何捕捉到这一点以避免至少崩溃吗?即使你能捕捉到这种异常,但你不能,通过忽略它来解决bug也没有什么意义。您需要显示对话框代码。@molbdnilo,添加了对话框代码。请看一看,是否有任何可能,因为我使用的是对话框的父窗口为空是所有这一切的原因。我应该给父母打电话吗*