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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf der MSDN-Seite für DllMain ein Angebot hat, die helfen könnten zu erklären, was mit Ihnen geschieht.
Also, wenn Sie den Aufruf von FreeLibrary es ist im wesentlichen ein sauberes Herunterfahren. Alles in einem gültigen Zustand noch. Alle threads die Dll erstellt werden, sind immer noch rund. Dessen Speicher ist immer noch rund.
Aber wenn Sie nur das Programm schließen (und nicht FreeLibrary aufrufen), dann ist es mehr wie ein not-shutdown (denken Sie abstürzt). Die Dll wird informiert, die von der OS eher als die app. Wenn diese die Folge eines Unfalls, dann in der Hoffnung der Speicher ist immer noch gültig, ist das nicht eine tolle Idee. Und der Stapel ist eh Weg.
Also meine Vermutung ist, Sie laufen in dieses problem, weil die nicht-befreiten Bibliotheken entladen sind anders.
Zur Zeit der Aufruf von FreeLibrary, andere Teile des Programms wurden alle kartiert in Ihren virtuellen Speicher. Wenn Ihre dll wurde automatisch freigegeben, nachdem andere Teile des Programms bereits heruntergefahren worden, dann weniger Teile des Programms wurden noch abgebildet in Ihren virtuellen Speicher.
Also an der Zeit, die Sie FreeLibrary aufgerufen, Ihre Fehler in der DLL_PROCESS_DETACH Fall wohl Speicher zugegriffen, die im Einsatz war, durch einen anderen Teil des Programms.