PRB: Do not Call ODBC Within DLL_PROCESS_DETACH Case
Article ID: 177135
Article Last Modified on 12/8/2003
APPLIES TO
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 6.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 6.0 Professional Edition
- Microsoft Visual C++ 6.0 Standard Edition
- 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.
Additional query words: crash hang hung halts GPF AV inproc kbmfc kbVC500 kbVC600
Keywords: kbdatabase kbprb KB177135