DOCUMENT:Q271208  23-JUN-2001  [visualc]
TITLE   :BUG: Crash in Mfc42(d).dll During Process Exit on Windows 95, W
PRODUCT :Microsoft C Compiler
PROD/VER::6.0
OPER/SYS:
KEYWORDS:kbMFC kbVC600bug kbOSWin95 kbOSWin98 kbOSWinME

======================================================================
-------------------------------------------------------------------------------
The information in this article applies to:

 - Microsoft Visual C++, 32-bit Enterprise Edition, version 6.0, on platform(s):
    - Microsoft Windows Millennium Edition 
    - Microsoft Windows 98 
 - Microsoft Visual C++, 32-bit Professional Edition, version 6.0, on platform(s):
    - Microsoft Windows Millennium Edition 
    - Microsoft Windows 98 
 - Microsoft Visual C++, 32-bit Learning Edition, version 6.0, on platform(s):
    - Microsoft Windows Millennium Edition 
    - Microsoft Windows 98 
-------------------------------------------------------------------------------

SYMPTOMS
========

When a process exits, you may experience a crash in the Mfc42.dll or Mfc42d.dll
file on Microsoft Windows 95, Microsoft Windows 98, or Microsoft Windows
Millennium (Me).

CAUSE
=====

The Mfc42(d).dll file assumes it is cleaning up on the main thread and relies on
the handle map that is stored into a thread-local storage value for the main
thread. If the handle map is missing, Microsoft Foundation Class Library (MFC)
may crash.

On a computer that is running Windows 95, Windows 98, or Windows Me, you can run
DLL_PROCESS_DETACH on any thread, rather than the thread that called the
ExitProcess function. (Microsoft Windows NT and Microsoft Windows 2000 exit the
process on the thread that called ExitProcess.)

RESOLUTION
==========

Use the static MFC library and not the shared MFC dynamic-link library (DLL).

STATUS
======

Microsoft has confirmed this to be a bug in the Microsoft products listed at the
beginning of this article.

MORE INFORMATION
================

Steps to Reproduce Behavior
---------------------------

1. Create a new MFC project and accept all the defaults.

2. Use class wizard to add a new handler for ID_FILE_OPEN in the CWinApp-derived
   class. Edit the code to read as follows:

       void CAssertApp::OnFileOpen()
       {
           CFileDialog dlg(TRUE);
           dlg.DoModal();
           ASSERT(FALSE);
       }

3. In the message map in the Assert.cpp file, remove the line that maps
   ID_FILE_OPEN to the CWinApp::OnFileOpen function.

4. Build the debug configuration.

5. Press F5 (on the Debug menu, and then click Go).

6. In the application, click the toolbar button to open a file.

7. Click Cancel in the Open File dialog box.

   The assertion is hit and a dialog box titled Debug Assertion Failed! is
   displayed.

8. Click Abort.

This is known to crash on Windows 98 Second Edition.

Additional query words:

======================================================================
Keywords          : kbMFC kbVC600bug kbOSWin95 kbOSWin98 kbOSWinME 
Technology        : kbVCsearch kbAudDeveloper kbVC32bitSearch
Version           : :6.0
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 2001.