MFC对话框成员变量的随机崩溃不在范围内

时间:2014-01-22 09:58:25

标签: c++ mfc dialog scope

我有一个带属性窗口的MFC应用程序。我在属性窗口中实现了一个自定义CMFCPropertyGridProperty,这样每当用户单击该属性中添加的按钮时,就会弹出另一个对话框。

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;
    }

但我不明白这是不是问题,为什么每次都不会发生。如果确实是问题,那么在做doModal()之后获得多个成员变量的最佳选择是什么。请帮忙。

1 个答案:

答案 0 :(得分:0)

最后,我做了一些改变,解决了这个问题。 1.更改自定义CMFCPropertyGridProperty类的构造函数,特别是COleVariant类型的参数。 2.更改对话框类构造函数以获取CTreeNode *并将其存储为成员变量。不知何故,指针在DoModal之后被破坏了。 3.添加一些Assert()来检查有效性,并在自定义CMFCPropertyGridProperty类的onclickbutton()中添加Redraw()。 我不知道所有这些变化的确切原因。在Google code

中找到了参考代码

以下是自定义CMFCPropertyGridProperty类的OnClickButton:

    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();
        }

    }

以下是自定义CMFCPropertyGridProperty类的构造函数:

     CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description)
    {
        //some initialization

    }