Closing documents caused random crash in ActiveX server application
Newbie to ActiveX. I have a MFC ActiveX server application developed
in VS2008 C++. If the application is running in stand alone mode, I
can open and close documents and shut it down without crash. However,
when running inside an ActiveX container, I got some random crash in
the ActiveX server application when trying to close its documents one
at a time. It doesn't happen all the time; i.e. most of times I can
shut down the server application and the container properly. But
there are times crash would happen. When it does crash, in debug
mode, I can see the =93pFrameWnd = 0xdddddddd=94, and it crashed right at
the line, (the line immediate following the while loop), if (pFrameWnd-
m_hWnd != NULL && pFrameWnd != pMainWnd). Any thought?
(I understand I propably should post it on an ActiveX group. But I
don't find any good ActiveX group that is =91active'.)
BOOL CWinThread::OnIdle(LONG lCount)
{
...
if (lCount <= 0)
{
// send WM_IDLEUPDATECMDUI to the main window
CWnd* pMainWnd = m_pMainWnd;
if (pMainWnd != NULL && pMainWnd->m_hWnd != NULL &&
pMainWnd->IsWindowVisible())
{
AfxCallWndProc(pMainWnd, pMainWnd->m_hWnd,
WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);
pMainWnd->SendMessageToDescendants(WM_IDLEUPDATECMDUI,
(WPARAM)TRUE, 0, TRUE, TRUE);
}
// send WM_IDLEUPDATECMDUI to all frame windows
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()-
m_thread;
CFrameWnd* pFrameWnd = pState->m_frameList;
while (pFrameWnd != NULL)
{
//****CRASH RIGHT HERE: pFrameWnd = 0xdddddddd in debug mode***//
if (pFrameWnd->m_hWnd != NULL && pFrameWnd != pMainWnd)
{
if (pFrameWnd->m_nShowDelay == SW_HIDE)
pFrameWnd->ShowWindow(pFrameWnd->m_nShowDelay);
if (pFrameWnd->IsWindowVisible() ||
pFrameWnd->m_nShowDelay >= 0)
{
AfxCallWndProc(pFrameWnd, pFrameWnd->m_hWnd,
WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);
pFrameWnd->SendMessageToDescendants(WM_IDLEUPDATECMDUI,
(WPARAM)TRUE, 0, TRUE, TRUE);
}
if (pFrameWnd->m_nShowDelay > SW_HIDE)
pFrameWnd->ShowWindow(pFrameWnd->m_nShowDelay);
pFrameWnd->m_nShowDelay = -1;
}
pFrameWnd = pFrameWnd->m_pNextFrameWnd;
}
}
...
return lCount < 1; // nothing more to do if lCount >= 1
}