FreeLibrary vs implizite DLL entladen

Implementierte ich eine DLL einschließlich der DllMain () - entry-Funktion:-

BOOL APIENTRY DllMain( HMODULE hModule,
  DWORD  ul_reason_for_call,
  LPVOID lpReserved
  )
{
    case DLL_PROCESS_ATTACH:
    /* here im doing file memory mapped through CreateFileMapping() API 
       and using it through MapViewOfFile() API
       storing some data structure in the file mapped area */
    ...
    case DLL_THREAD_ATTACH:
    ...
    case DLL_THREAD_DETACH:
    ...
    case DLL_PROCESS_DETACH:
    /* Here unmapping first through UnmapViewOfFile() API
       then tries to access the stroed data structure which is illegal 
       as we have already closed the file mapping
       This is the buggy code. The order should be first access the mapped memory 
       region and then unmap it */
       cout <<" some message"<<endl;
    ...

}

Leider machte ich einen Fehler in DLL_PROCESS_DETACH Fall und den Zugriff auf illegale memorey (access violation).

Machte ich ein Beispielprogramm lädt die Bibliothek mit LoadLibrary () - Funktion, verwendet die Funktion Bibliothek und schließlich rufen Sie FreeLibrary() und zurück.

Wenn ich ausgeführt, dieses Programm, ich habe nicht bekommen irgendeine Fehlermeldung.
Aber wenn ich entfernen Sie FreeLibrary(), in diesem Fall die DLL_PROCESS_DETACH-Fall ausgeführt wird implizit und dieses mal gibt es Fehler-dialog-box zu erwähnen, dass es Zugriffsverletzung.

Warum Aufruf von FreeLibrary() unterdrücken diesen Fehler? ODER es intern diese Ausnahme behandelt?
Was ist der empfohlene Weg.

Update: ich habe die details für das ANFÜGEN und TRENNEN. Wahrscheinlich wird es helfen, warum bin ich nicht im klaren über das Verhalten beobachtet.
Mit FreeLibrary () - Aufruf, ich habe keine Fehlermeldung, aber die cout-Nachricht nicht angezeigt wurde. Es scheint abgestürzt zu, aber nicht bnotified.
Aber wenn ich entfernen Sie FreeLibrary(), in diesem Fall die DLL_PROCESS_DETACH-Fall ausgeführt wird implizit und gibt Zugriffsverletzung Dialogfeld.
Idealerweise im ersteren Fall als gut, es sollte den Fehler anzeigen. Also ich vermute, dass die FreeLibrary() unterdrückt diese access violation Fehler.

InformationsquelleAutor Adil | 2010-04-28
Schreibe einen Kommentar