我在子对话框定义了一个指向其他对话框的指针pDlg,然后子对话框执行以下消息响应函数,不知道这样定义指针在最后执行CSetINIDialog::OnOK();语句的时候会不会出问题,还请各位高手给与指点,谢谢!        //基准中断
UpdateData(TRUE);
pDlg->m_DCSDate.m_INT0Period=m_INT0Period;
m_INT0Period=m_INT0Period*10000/625-1;
BYTE senddata0[2] = {0};
senddata0[0] = 0x20;
senddata0[1] = 256-(BYTE)m_INT0Period;
pDlg->m_DCSSerial.Write(senddata0,2);
//中断电路1
pDlg->m_DCSDate.m_INT1Period=m_INT1Period;
m_INT1Period=m_INT1Period*10000/625-1;
BYTE senddata1[2] = {0};
senddata1[0] = 0x24;
senddata1[1] = 256-(BYTE)m_INT1Period;
pDlg->m_DCSSerial.Write(senddata1,2);
//中断电路2
pDlg->m_DCSDate.m_INT2Period=m_INT2Period;
m_INT2Period=m_INT2Period*10000/625-1;
BYTE senddata2[2] = {0};
senddata2[0] = 0x28;
senddata2[1] = 256-(BYTE)m_INT2Period;
pDlg->m_DCSSerial.Write(senddata2,2);
//中断电路3
pDlg->m_DCSDate.m_INT4Period=m_INT4Period;
m_INT4Period=m_INT4Period*10/625-1;
m_INT4Period=1024-m_INT4Period;
BYTE senddata4[2] = {0};
senddata4[0] = 0x2C|((BYTE)(m_INT4Period>>8));
senddata4[1] = (BYTE)m_INT4Period;
pDlg->m_DCSSerial.Write(senddata4,2); MessageBox("配置成功!");
        CSetINIDialog::OnOK();

解决方案 »

  1.   

    这个pDlg是模式还是非模式?是否指向一个已经运行的对话框?
      

  2.   

    那就要看在整个这个消息函数执行过程中,pDlg是否都一直指向有效的内存。如果当前这个对话框是模式的,那应该不会有什么问题,但如果是非模式的,那这个消息函数执行过程中,pDlg指向的对话框有可能已经销毁了。那可能就会出现内存访问错误,但也不一定在CSetINIDialog::OnOK();中。
      

  3.   

    只要pDlg指向的对话框在你这个对话框之后退出,就没有问题。
      

  4.   

    再问一个比较弱的问题,我现在的情况是,执行这个按钮以后,两个对话框全都没有了,CSetINIDialog::OnOK();这句话用错了还是会有其他的问题?
      

  5.   

    还有就是pDlg应该创建在上面的函数中,还是子对话框类声明的public下面?
      

  6.   

    两个对话框哪个是模态,哪个不是,创建的先后顺序怎样?pDlg是不是局部变量?代码贴出来看看。
      

  7.   

    我建立的一个名叫USBDCS的对话框工程,
    单击菜单弹出小对话框,
    小对话框有按钮void CSetINIDialog::OnOKSetIni()能把数据返回到CUSBDCSDocument里面
    小对话框是模态对话框
    pDlg是小对话框***.h的public中声明的,指向CUSBDCSDlg
      

  8.   


    void CSetINIDialog::OnOKSetIni() 
    {
    // TODO: Add your control notification handler code here
    //基准中断
    UpdateData(TRUE);
    CUSBDCSDlg* pDlg;
    pDlg->m_DCSDate.m_INT0Period=m_INT0Period;
    m_INT0Period=m_INT0Period*10000/625-1;
    BYTE senddata0[2] = {0};
    senddata0[0] = 0x20;
    senddata0[1] = 256-(BYTE)m_INT0Period;
    pDlg->m_DCSSerial.Write(senddata0,2);
    //中断电路1
    pDlg->m_DCSDate.m_INT1Period=m_INT1Period;
    m_INT1Period=m_INT1Period*10000/625-1;
    BYTE senddata1[2] = {0};
    senddata1[0] = 0x24;
    senddata1[1] = 256-(BYTE)m_INT1Period;
    pDlg->m_DCSSerial.Write(senddata1,2);
    //中断电路2
    pDlg->m_DCSDate.m_INT2Period=m_INT2Period;
    m_INT2Period=m_INT2Period*10000/625-1;
    BYTE senddata2[2] = {0};
    senddata2[0] = 0x28;
    senddata2[1] = 256-(BYTE)m_INT2Period;
    pDlg->m_DCSSerial.Write(senddata2,2);
    //中断电路3
    pDlg->m_DCSDate.m_INT4Period=m_INT4Period;
    m_INT4Period=m_INT4Period*10/625-1;
    m_INT4Period=1024-m_INT4Period;
    BYTE senddata4[2] = {0};
    senddata4[0] = 0x2C|((BYTE)(m_INT4Period>>8));
    senddata4[1] = (BYTE)m_INT4Period;
    pDlg->m_DCSSerial.Write(senddata4,2); MessageBox("配置成功!");
    CSetINIDialog::OnOK();

    }
      

  9.   

    你这样写:CUSBDCSDlg* pDlg;
    pDlg->m_DCSDate.m_INT0Period=m_INT0Period貌似pDlg没初始化就被使用了。既然pDlg是成员变量,为什么这里又重新定义一个?
      

  10.   

    UpdateData(TRUE);
        CUSBDCSDlg* pDlg=new CUSBDCSDlg;
    应该可以解决内存问题