DOCUMENT:Q190519 07-AUG-1998 [vbwin] TITLE :BUG: UserControl Causes VB IDE to Crash on Shutdown PRODUCT :Microsoft Visual Basic for Windows PROD/VER: OPER/SYS:WINDOWS KEYWORDS: ====================================================================== --------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, versions 5.0, 6.0 --------------------------------------------------------------------- SYMPTOMS ======== A UserControl is added to a Visual Basic project. When you try to exit the IDE, Visual Basic causes an Invalid Page Fault (IPF) and terminates. This is preceded by the error message: The memory could not be "written". CAUSE ===== The problem is that the UserControl has two module level variables, one that holds onto a reference to the UserControl itself (Set m_oMe = Me) and another that holds a reference to control's parent (Set m_oParent = Extender.Parent). This causes a circular reference count on the control and the container. When you try to exit the IDE, Visual Basic destroys the design-time form container and attempts to release the UserControl instance. Because the control has a reference to itself and the form, Visual Basic cannot properly destroy the objects; consequently an Invalid Page Fault occurs. RESOLUTION ========== Avoid setting module level variables that reference both a control and its container. Setting the variables to Nothing in the UserControl_Terminate event will not avoid the error because the Terminate event will never fire if the control has a circular reference. STATUS ====== Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available. MORE INFORMATION ================ Steps to Reproduce Behavior --------------------------- 1. Start a new ActiveX Control project in Visual Basic. UserControl1 is created by default. 2. Copy the following code to the Code window of UserControl1: Option Explicit Private m_oMe As Object Private m_oParent As Object Private Sub UserControl_InitProperties() Set m_oMe = Me Set m_oParent = UserControl.Extender.Container Let UserControl.BackColor = &HFF0000 End Sub Private Sub UserControl_Terminate() Set m_oMe = Nothing Set m_oParent = Nothing End Sub 3. [Optional] Save and compile Project1. 4. Close UserControl1's design window. 5. Choose Add Project from the File menu and add a Standard EXE project to the project group. Form1 is created by default. 6. Add the UserControl you created to Form1. 7. Now exit the Visual Basic IDE, by pressing ALT+Q or the close button on the title bar. When prompted to save changes, select "No". The IDE will crash on exit. REFERENCES ========== For additional information, please see the following articles in the Microsoft Knowledge Base: ARTICLE-ID: Q189156 TITLE : BUG: Crash When Closing Application That Uses ActiveX DLL ARTICLE-ID: Q184332 TITLE : BUG: UserControl in VB4 or VC++ 5.0 Container Causes IPF on Exit Additional query words: kbDSupport kbDSD kbVBp kbVBp600bug kbVBp500bug kbCtrlCreate kbIDE ====================================================================== Platform : WINDOWS Issue type : kbbug ============================================================================= 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. Copyright Microsoft Corporation 1998.