Microsoft KB Archive/161874

= FIX: Displaying CPropertySheet in COleControl Causes Assert =

Article ID: 161874

Article Last Modified on 12/10/2003

-

APPLIES TO


 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 4.2 Enterprise Edition
 * Microsoft Visual C++ 4.2 Professional Edition

-



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.



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: kbbug kbfix kbnoupdate kbuidesign kblocalsvr kbvc500fix kbctrl KB161874

-

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

© Microsoft Corporation. All rights reserved.