FIX: Displaying CPropertySheet in COleControl Causes Assert

Last reviewed: September 19, 1997
Article ID: Q161874
The information in this article applies to:
  • Microsoft Visual C++, 32-bit Edition, versions 4.0, 4.1, 4.2

SYMPTOMS

Calling CPropertySheet::DoModal() from a method or message handler in a COleControl-derived class may cause an assert in WINOCC.CPP, line 325, when the property sheet is dismissed.

CAUSE

The assert is in CWnd::EnableWindow() where it is checking if the m_hWnd member of the CWnd object is valid.

In CPropertySheet::DoModal(), MFC gets the parent window via:

   CWnd* pParentWnd = CWnd::GetSafeOwner(m_pParentWnd,&hWndTop);

This creates a temporary CWnd* called pParentWnd. RunModalLoop() is called next and returns after the property sheet is dismissed. When MFC tries to call EnableWindow() through the pParentWnd pointer, the m_hWnd is no longer valid.

This behavior occurs because during RunModalLoop(), COleControl::OnPaint() will be called. COleControl::OnPaint(), in turn, calls AfxUnlockTempMaps(). This function deletes temporary objects that were previously created. In this case, the "pParentWnd" pointer is being destroyed.

RESOLUTION

You can prevent temporary objects from being destroyed by calling AfxLockTempMaps() before CPropertySheet::DoModal(). You will need to call AfxUnlockTempMaps() after CPropertySheet::DoModal() to allow temporary objects to be cleaned up.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug has been corrected in Visual C++ version 5.0.

MORE INFORMATION

AfxLockTempMaps() and AfxUnlockTempMaps() are undocumented functions and may change in future versions of MFC.

Sample Code

   /* Compile options needed: default
   This code snippet displays a CPropertySheet in response to a right-mouse
   click in the COleControl.
   */
   void CTestCtrl::OnRButtonDown(UINT nFlags, CPoint point)
   {
      CPropertySheet sheet;
      CMyPage page;
      sheet.AddPage (&page);

           // Prevent temporary objects from being destroyed.
      AfxLockTempMaps ();

      sheet.DoModal ();

           // Allow temporary objects to be cleaned up.
      AfxUnlockTempMaps ();

      COleControl::OnRButtonDown(nFlags, point);
   }


Additional query words: ocx

Keywords : MfcOLE MfcUI vcbuglist400 vcfixlist500 kbbuglist kbfixlist
Technology : kbMfc
Version : 4.0 4.1 4.2
Platform : NT WINDOWS
Issue type : kbbug
Solution Type : kbfix


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 19, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.