Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » ODBC-Unterstützung

 

Hinweise zur Windows-Funktion DllMain

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 [external link] http://msdn.microsoft.com/de-de/windows/hardware/gg487379.aspx.