ODBC-Funktionen dürfen in einer Windows-DLL nicht direkt oder indirekt von der DllMain-Funktion aufgerufen werden. Die DllMain-Eintrittspunktfunktion soll nur einfache Initialisierungs- und Beendigungsaufgaben ausführen. Der Aufruf von ODBC-Funktionen wie SQLFreeHandle, SQLFreeConnect und SQLFreeEnv können Deadlocks und eine Zirkeldefinition bewirken.
Das folgende Codebeispiel zeigt eine fehlerhafte Programmierung. Wenn der Microsoft ODBC-Treibermanager erkennt, dass der letzte Zugriff auf den SQL Anywhere ODBC-Treiber abgeschlossen wurde, wird der Treiber entladen. Wenn der SQL Anywhere ODBC-Treiber heruntergefahren wird, stoppt er alle aktiven Threads. Die Threadbeendigung führt zu einem rekursiven Thread-Ablösungsaufruf in DllMain. Da der Aufruf in DllMain serialisiert ist und ein Aufruf läuft, wird der neue Thread-Ablösungsaufruf nie gestartet. Der SQL Anywhere ODBC-Treiber wartet unbegrenzt, dass diese Threads beendet werden und Ihre Anwendung hängt.
BOOL APIENTRY DllMain( HMODULE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { HANDLE *handles; switch( fdwReason ) { . . . case DLL_THREAD_DETACH: /* do thread cleanup */ handles = (HANDLE *) TlsGetValue( TlsIndex ); if( handles != NULL ) { SQLHENV tls_henv; SQLHDBC tls_hdbc; tls_henv = (SQLHENV) handles[0]; tls_hdbc = (SQLHDBC) handles[1]; if( tls_hdbc != NULL ) SQLFreeHandle( SQL_HANDLE_DBC, tls_hdbc ); if( tls_henv != NULL ) SQLFreeHandle( SQL_HANDLE_ENV, tls_henv ); handles[0] = NULL; handles[1] = NULL; } break; . . . } return TRUE; /* indicate success */ } |
Weitere Informationen finden Sie im Microsoft-Whitepaper Best Practices for Creating DLLs unter http://msdn.microsoft.com/de-de/windows/hardware/gg487379.aspx.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |