Fun with CStatic destructor
I'm getting very stumped here and wondered if anyone could help out.
The interesting bit of code is:
if(dlg.DoModal()==IDOK)
{
if(dlg.check[0].GetChecked())
IssueLetter('S',"SU","","",false,false,-1);
if(dlg.check[1].GetChecked())
IssueLetter('S',"SB","","",false,false,-1);
if(dlg.check[2].GetChecked())
IssueLetter('S',"SH","","",false,false,-1);
}
If I click OK on the dialog, the letters are produced by IssueLetter()
and all is well. If I click CANCEL then I get an unhandled exception in
this:
CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
if (m_xDispatch.m_vtbl != 0)
((COleDispatchImpl*)&m_xDispatch)->Disconnect(); // HERE
ASSERT(m_dwRef <= 1);
#endif
#ifdef _AFXDLL
m_pModuleState = NULL;
#endif
}
Interestingly, the effects are the same when I comment out the if(dlg)s
in my code (i.e. leaving an empty if()). I get the same effect if I
don't check any checkboxes and select "OK" and if I do select one and
select "Cancel".
Looking at the callstack, the exception is occuring from a CStatic
destructor (the dialog is built on-the-fly so constructs it's own
statics and checkboxes), called during the dialog destructor called at
the end of the function the above code is in.
As I said at the top, I'm well stumped. To my mind, the static
destructors get called in exactly the same way whether I say "OK" or
"Cancel" but the evidence suggests otherwise.
I have overidden OnOK() and OnCancel() as follows, but can't see that
they should have any effect (and all work fine for other uses of this
dialog):
void CInputDlg::OnOK()
{
if(GetFocus()!=&m_ok) // came here by pressing RETURN
{
m_ok.SetFocus(); // m_ok is the OK button
m_ok.PostMessage(WM_LBUTTONDOWN);
}
else CDialog::OnOK();
}
void CInputDlg::OnCancel()
{
pDoc->SetExiting(true); // sets a flag in the document
CDialog::OnCancel();
}
I'm running VC6 with all the Service Packs, if that makes any
difference.
Any ideas?
Paul.