FIX: ActiveX Control in IE Asserts in CTLINPLC.CPP, Line 328 (167697)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.0a
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Editions 4.2b
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++, 32-bit Enterprise Edition 5.0
- Microsoft Visual C++, 32-bit Professional Edition 5.0
- Microsoft Internet Explorer (Programming) 3.0
- Microsoft Internet Explorer (Programming) 3.01
- Microsoft Internet Explorer (Programming) 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.
Modification Type: | Major | Last Reviewed: | 12/8/2003 |
---|
Keywords: | kbBug kbCtrl kbCtrlCreate kberrmsg kbfix kbNoUpdate kbVC600fix KB167697 |
---|
|