简体   繁体   中英

Child Dialog - SetWindowTextA or SendMessageA crashes program - MFC

ERROR: afxwin2.inl line 165

My app is a dialog box with a few edit boxes. Once I click the button to evaluate the information entered I want to open a child dialog to display the results. I tried overloading DoModal() like this:

//in the child dialog
//.h    
CResultsDlg::CResultsDlg(CParentDlg *parent); 
virtual INT_PTR DoModal(float bmi); 

//.cpp    
CResultsDlg::CResultsDlg(CParentDlg *parent) : CDialogEx(CResultsDlg::IDD), _parent(parent)
{   //initializations  }

INT_PTR CResultsDlg::DoModal(float bmi)
{
    m_sBMI.Format("%f", bmi);
    m_hBMI.SetWindowTextA(m_sBMI); //crashes !!!!!!!!!! 
    m_hBMI.SendMessageA(WM_SETTEXT, 0, (LPARAM)"15.11"); //crashes !!!!!!!! 

//  OnInitDialog(); //because this wasn't getting called at all
    return CDialogEx::DoModal();
}

BOOL CResultsDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
//  __super::OnInitDialog(); //no difference...

m_hBMI.SetWindowTextA("10.3"); //crashes !!!

return true;  // return TRUE unless you set the focus to a control
}


//in the parent dialog 
//.cpp
void CParentDlg::OnBnClickedCalculate()
{
    CResultsDlg childResultsDlg = this;
    childResultsDlg.DoModal(15.7);
}

m_hBMI is a handle to a static text control. I tested an edit box but it still crashed. I understand that it probably has something to do with the controls not being created yet but I tried every way I know.

Using breakpoints, I confirmed that OnInitDialog does not get called at all unless I put it in the overloaded DoModal function. SetWindowText/SendMessage still crashes in OnInitDialog with the same ASSERT error.

If I remove all SetWindowText/SendMessage then the child window does come up modal like it should but the 'result' static text control is the same as the text I set it to in the dialog editor properties pane.

Thanks !!!!!

*MORE DETAILS* -----------

void CResultsDlg::DoDataExchange(CDataExchange* pDX)    // DDX/DDV support
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_BMI, m_fBMI);
    DDV_MinMaxFloat(pDX, m_fBMI, 0, 100);
    DDX_Control(pDX, IDC_BMI, m_hBMI);
}

The usual sequence when you start a dialog is:

  • You call CDialog::DoModal.
  • The dialog window gets created.
  • The child controls of the dialog get created.
  • OnInitDialog gets called.
  • CDialog::OnInitDialog calls DoDataExchange.
  • You have a DDX_Control call in your DoDataExchange method to map the child control to a member variable.

Notice that the member variables only get initialized at the end of that sequence. You're trying to use them way before, so you get a crash.

Store the value you need for initialization in a member variable and take care of it in DoDataExchange.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM