Notice: This website is an unofficial Microsoft Knowledge Base (hereinafter KB) archive and is intended to provide a reliable access to deleted content from Microsoft KB. All KB articles are owned by Microsoft Corporation. Read full disclaimer for more details.

FIX: MFC DAO or ODBC App Crashes on Exit


View products that this article applies to.

This article was previously published under Q153897

↑ Back to the top


Symptoms

An application intermittently crashes on exit and an error similar to the following appears:
<application> caused an invalid page fault in
module KERNEL32.DLL at 0137:bff9a07c.
This behavior occurs when the application is using the MFC DAO classes, the MFC ODBC classes, or the ODBC API to access a database using the Jet Database Engine.

↑ Back to the top


Resolution

Call the LoadLibrary() function on the Jet Engine as shown in the sample code below. This call needs to be done only once during execution of the program. To minimize any adverse affect on performance, call LoadLibrary() only after the database has been opened. Do not call FreeLibrary() for this DLL. The DLL will be automatically unloaded when the application exits.

This bug has been fixed in Jet 3.5 that is included with Visual C++ 5.0. If you are using the ODBC, you can simply use the newer ODBC driver that is available with Visual C++ 5.0. If you are using DAO, you need to build your application using Visual C++ 5.0 to use DAO 3.5. The earlier MFC classes use DAO/Jet 3.0 and do not recognize DAO 3.5.

↑ Back to the top


Status

This bug has been fixed in Jet 3.5 that is included with Visual C++ 5.0.

↑ Back to the top


More information

This problem occurs only if a dialog resource is loaded. This includes applications that use CFormView-derived classes, such as CRecordView and CDaoRecordView, as well as dialog-based applications.

The following sample code shows the workaround for a default MFC AppWizard application using the MFC DAO classes. The call to LoadLibrary() is added to the Open() function of the CDaoRecordset-derived class named CMySet. Similar logic can be used for the MFC ODBC classes.

To fix the DAOEnrol sample, add the LoadLibrary() call in the sample code below to the CDaoEnrolDoc::OnNewDocument() function, before the call to the base class CDocument::OnNewDocument() function.

To fix the Enroll tutorial, add the LoadLibrary() call in the sample code below to the CEnrollDoc::GetDatabase() function, after the call to m_database.Open().

Sample Code

   void CMySet::Open(int nOpenType, LPCTSTR lpszSql, int nOptions)
   {
       CDaoRecordset::Open(nOpenType, lpszSql, nOptions);

       // Load the Jet Engine to ensure that it remains in memory
       // during the shutdown process.
       LoadLibrary( "MSJT3032.DLL" );
   }
				

↑ Back to the top


Keywords: kbfix, kbinterop, kbdatabase, kbprogramming, kbvc500fix, kbprb, kbbug, KB153897

↑ Back to the top

Article Info
Article ID : 153897
Revision : 2
Created on : 12/1/2003
Published on : 12/1/2003
Exists online : False
Views : 413