最近用VS2005写了个MFC多窗口工具,但是在关闭exe时,出现”应用程序错误“的提示

以下是我关闭窗口时的代码!通过单步调试,运行到最后个”}“按F5就出现如上图所示的错误。
void CRO2TestDlg::OnClose()
{
//if (MessageBox(_T("是否退出程序?"), _T("友情提示"), MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2) == IDNO)
if (MessageBox(_T("是否退出程序?"), _T("友情提示"), MB_YESNO|MB_ICONQUESTION) == IDNO)
{
return;
}
#if 1
//============保存界面值===========
if (SaveFilePath == "NULL")
FileSaveas();
SaveNetConfigs();
#endif
#if 1
//excel的一些相关操作:释放对象(相当重要!)
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();

//excel的一些相关操作::退出程序
app.Quit();
//m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
app.ReleaseDispatch();
//::CoUninitialize();

//连接成功与否标识:0未连接 1连接
socketFlag = 0;
//=========关闭所有定时器===================
KillTimer(IDC_SOCKET_TIMER);//连接终端
KillTimer(IDC_DEVICE_TIMER);
KillTimer(IDC_HIGHDEV_TIMER);
KillTimer(IDC_ALARM_TIMER);
KillTimer(IDC_FACTORY_TIMER);
KillTimer(IDC_NEW_TIMER);
KillTimer(IDC_WATCH_TIMER);
KillTimer(IDC_XCJL_TIMER);
KillTimer(IDT_AUTO_TIMER);
#endif
//=====关闭线程======
KillRcvThread(this);
m_thrdReceive = NULL;
KillSGMRcvThread(this);
m_thrdSGMReceive = NULL;
ClearBuffer(BufRcv + MAX_COMMBUF_LEN);
ClearSGMBuffer(SGMBufRcv + MAX_COMMBUF_LEN);

#if 1
SaveFilePath = "NULL";
OpenFilePath = "NULL";
PLFilePath = "NULL";
#endif
//===关闭串口===
if (m_port.IsOpen())
m_port.Close();
if (m_SMG_port.IsOpen())
m_SMG_port.Close();

//关闭子窗口
m_para7.OnClose();
m_para6.OnClose();
m_para5.OnClose();
m_para4.OnClose();
m_para3.OnClose();
m_para2.OnClose();
m_para1.OnClose();

//DestroyWindow();//仅仅释放窗口相关内存,并不销毁窗口对象
CDialog::OnCancel();
CDialog::OnClose();
//CDialog::OnOK();
}
单步调试,总是调到crtexe.c函数中的“if (*lpszCommandLine==DQUOTECHAR) inDoubleQuote=!inDoubleQuote;“
  1. OnCancel和OnClose不应该重复调用基类函数,只调用一个即可,推荐OnCancel

  2. 单步调试中,在下方调用堆栈中,找到具体出错的程序代码(而不是系统代码),看看,是线程报错还是OnClose报错。