Die Funktion 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 ) { HENV tls_henv; HDBC tls_hdbc; tls_henv = (HENV) handles[0]; tls_hdbc = (HDBC) 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 über bewährte Verfahren zur Erstellung von DLLs unter http://msdn.microsoft.com/de-de/windows/hardware/gg487379.aspx.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |