Microsoft KB Archive/192853

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

Article ID: 192853

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft Foundation Class Library 4.2, when used with:
 * Microsoft Visual C++ 6.0 Enterprise Edition

-



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= ;PWD= ;"); 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= ;PWD= ;"); 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.

Keywords: kbqfe kbbug kbdatabase kbfix kbnoupdate KB192853

-

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

© Microsoft Corporation. All rights reserved.