Microsoft KB Archive/167697

From BetaArchive Wiki

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

  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