FIX: Displaying CPropertySheet in COleControl Causes Assert (161874)
The information in this article applies to:
- Microsoft Visual C++ 4.0
- Microsoft Visual C++ 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 4.2
This article was previously published under Q161874 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.
Modification Type: | Major | Last Reviewed: | 12/10/2003 |
---|
Keywords: | kbBug kbCtrl kbfix kbLocalSvr kbNoUpdate KbUIDesign kbVC500fix KB161874 |
---|
|