Article ID: 167697
Article Last Modified on 11/21/2006
APPLIES TO
- Microsoft Foundation Class Library 4.2, when used with:
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 4.1 Subscription
- Microsoft Visual C++ 4.2 Professional Edition
- Microsoft Visual C++ 4.2 Enterprise Edition
- Microsoft Visual C++ 4.2 Professional Edition
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Internet Explorer 3.0
- Microsoft Internet Explorer 3.01
- Microsoft Internet Explorer 3.02
This article was previously published under Q167697
SYMPTOMS
Clicking on an MFC ActiveX control that is hosted in a frame in Internet Explorer may cause an assert in CTLINPLC.CPP, line 328.
CAUSE
The assert is in COleControl::BuildSharedMenu(), where it checks:
if (m_pUIActiveInfo != NULL) { ASSERT(m_pUIActiveInfo->m_hSharedMenu != NULL); return TRUE; }
m_pUIActiveInfo->m_hSharedMenu will always be NULL because you are not doing menu merging. m_pUIActiveInfo is set to NULL when the control is UI de-activated. In this case, the control is inplace activated when you first click on it, so COleControl::OnActivateInPlace() is called. This, in turn, calls BuildSharedMenu(). When BuildSharedMenu() returns, but before OnActivateInPlace() is exited, Internet Explorer calls DoVerb(OLEIVERB_UIACTIVATE) on the control. This causes OnActivateInPlace() to be re-entered and BuildSharedMenu() to be called again. Because the control has not been UI-de-activated, m_pUIActiveInfo is not NULL.
RESOLUTION
You need to prevent OnActivateInPlace() from being re-entered by overriding OnActivateInPlace() and setting a static boolean flag to determine if it has been re-entered. If that is the case, then return the following:
HRESULT CTestCtrl::OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg) { static BOOL bInsideFunc = FALSE; if (!bInsideFunc) { bInsideFunc = TRUE; HRESULT hr = COleControl::OnActivateInPlace(bUIActivate, pMsg); bInsideFunc = FALSE; return hr; } return S_OK; }
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in Visual C++ version 6.0 for Windows.
MORE INFORMATION
Steps to Reproduce Behavior
- Put an MFC ActiveX control in a frame in Internet Explorer.
- Click on the control.
- Click on a different frame.
- Click back on the control.
Keywords: kberrmsg kbbug kbfix kbnoupdate kbvc600fix kbctrlcreate kbctrl KB167697