PRB: Do not Call ODBC Within DLL_PROCESS_DETACH Case (177135)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6

This article was previously published under Q177135

SYMPTOMS

When using the MFC Database classes or calling ODBC functions within the DLL_PROCESS_DETACH case of the DllMain() function, an access violation can occur especially if the DLL links to the MFC DLL (which does a LoadLibrary call to call ODBC). For example, calling CDatabase::Close() from the destructor of a global static object in the DLL causes an access violation error in ODBC32.DLL.

CAUSE

Because there are no guarantees of the order by which DLLs receive the DLL_PROCESS_DETACH case, it is possible that the ODBC handle memory can be freed before your DLL's DllMain() function gets called with DLL_PROCESS_DETACH. Therefore, any calls to ODBC using those handles can cause a crash.

RESOLUTION

Do not call ODBC functions or use the MFC ODBC classes in destructors of global objects within DLLs or in the DllMain() DLL_PROCESS_DETACH case.

Instead use a termination function in the DLL which the application can call before exiting.

STATUS

This behavior is by design.

Modification Type:MajorLast Reviewed:12/8/2003
Keywords:kbDatabase kbprb KB177135