A line 879 assert error occurs in the Wincore.cpp file when you use MFC classes (192853)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0

This article was previously published under Q192853

SYMPTOMS

When you use MFC, the following assert can occur:

Program: e:\test\app.exe File: wincore.cpp Line: 879

The following example calls CDatabase::OpenEx() from inside an MFC regular DLL and shows the resulting assert. The problem is not limited to the MFC Database classes.

If you expose an OLE automation method in an MFC regular DLL and have code like:
   STDMETHODIMP CTest::TestMethod()
   {
      AFX_MANAGE_STATE(afxGetStaticModuleState())
      CDatabase db;
      db.OpenEx("DSN=LocalServer;Database=pubs;UID=<username>;PWD=<strong password>;");
      db.Close();

      return S_OK;
   }
				
the assertion dialog appears.

This doesn't happen in an application built with Visual C++, version 5.0. Also this problem only occurs in debug builds. The release build runs correctly.

CAUSE

Code has been added to the GetSafeOwner_() call that calls GetRoutingFrame_(). In the GetRoutingFrame_() function, you can see the following code:
   if (pFrame != NULL)
      ASSERT_VALID(pFrame);
				
This assertion is not correct. This assertion assumes that there is a handle map and that the pFrame CWnd * is in either the temporary or permanent CWnd handle map. Neither of these situations is true in the scenario described in the Symptoms section.

RESOLUTION

To get rid of the failed asserts, you can add the following code to debug builds:

Note Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
   class CTempRoutingFrame
   {
      CFrameWnd* m_pFrame ;
      public:
        CTempRoutingFrame(CFrameWnd * pWnd= NULL)
        {
          // Save current value.
          m_pFrame = AfxGetThreadState()->m_pRoutingFrame;
          // Set to value passed in. NULL by default.
          AfxGetThreadState()->m_pRoutingFrame = pWnd;
        }
        ~CTempRoutingFrame()
        {
          // Restore m_pRoutingFrame to original value.
          AfxGetThreadState()->m_pRoutingFrame = m_pFrame;
        }
   };

   STDMETHODIMP CsrvTest2::Test()
   {
      AFX_MANAGE_STATE(AfxGetStaticModuleState())

      #ifdef _DEBUG
        CTempRoutingFrame tmp;
      #endif

      CDatabase db;
      db.OpenEx("DSN=LocalServer;Database=pubs;UID=<username>;PWD=<strong password>;");
      db.Close();

      return S_OK;
   }
				
If you need to add this code in many places, you may want to write a macro such as the following:
   #ifdef _DEBUG
      #define ASSERT_FIX() CTempRoutingFrame tmp;
   #else
      #define ASSERT_FIX()
   #endif
				
So you can do the following:
   STDMETHODIMP CsrvTest2::Test()
   {
      AFX_MANAGE_STATE(AfxGetStaticModuleState())
      ASSERT_FIX()
      ...
   }
				

STATUS

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

This problem was corrected in Microsoft Visual C++ .NET.

Modification Type:MajorLast Reviewed:6/10/2005
Keywords:kbQFE kbBug kbDatabase kbfix kbNoUpdate KB192853 kbAudDeveloper