Microsoft KB Archive/167697

= FIX: ActiveX Control in IE Asserts in CTLINPLC.CPP, Line 328 =

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</li></ul>

 Microsoft Visual C++ 4.2 Enterprise Edition</li></ul>

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 5.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Internet Explorer 3.0</li></ul>

 Microsoft Internet Explorer 3.01</li></ul>

 Microsoft Internet Explorer 3.02</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q167697

<div class="symptoms_section">

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.

<div class="cause_section">

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.

<div class="resolution_section">

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; }

<div class="status_section">

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.

<div class="moreinformation_section">

Steps to Reproduce Behavior

 * 1) Put an MFC ActiveX control in a frame in Internet Explorer.
 * 2) Click on the control.
 * 3) Click on a different frame.
 * 4) Click back on the control.

Keywords: kberrmsg kbbug kbfix kbnoupdate kbvc600fix kbctrlcreate kbctrl KB167697

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.