AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreeLibrary oder UnloadPackage in Finalization
Thema durchsuchen
Ansicht
Themen-Optionen

FreeLibrary oder UnloadPackage in Finalization

Ein Thema von QuickAndDirty · begonnen am 26. Feb 2010 · letzter Beitrag vom 26. Feb 2010
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 12:17
FreeLibrary wirft im Finalization Teil eine Exception.

Ich lade die DLLs und Packages dynamsch.
Passiert das entladen der DLLs automatisch vor dem Finalization Teil so das es ein Fehler ist das dort zu machen?

Gilt das selbe auch für den UnloadPackage Befehl?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 12:22
Hast du mal ein Beispiel?

Ich hatte jedenfalls noch keine Probleme eine DLL an dieser Stelle zu entladen.
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#3

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 12:36
Das wäre der teil in dem es passiert.
hier werden im Finalization alle plug-ins augeladen
Delphi-Quellcode:
If Libs[index].TheLibKind = lkBPL then
  UnloadPackage(Libs[index].TheLibHandle)
else if Libs[index].TheLibKind = lkDLL Then
  FreeLibrary(Libs[index].TheLibHandle); // <--- hier kommt die exception
Flist[index] := nil;
Flist.Delete(index);
Das ganze System oder auch nur die unit sind wohl zu groß um hier hochgeladen zu werden.
Vermutlich müsste ich ein test Programm schreiben....
...dumm nur das der Fehler in einem Testprogramm auftritt in dem ich etwas ganz anderes testen wollte.


Edit1: Das handle das freigegeben wird ist auch das selbe das erzeugt wurde. Und es wurde auch mit Loadlibary erzeugt.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 12:46
FreeLibrary erzeugt von sich aus aigentlich nur selten eine Exception.
Wird vielleicht innerhalb der DLL, beim Entladen, auf etwas anderes zugegriffen, welches zu diesem Zeitpunkt schon entfernt wurde?



Weiß ja nicht, was sonst noch für Code behandelt wird, aber wenn nur die Liste abgearbeitet und alles freigegeben werden soll:
Code:
[s]for index := Libs.Count - 1 downto 0 do
  case Libs[index].TheLibKind of
    lkBPL: UnloadPackage(Libs[index].TheLibHandle);
    lkDLL: FreeLibrary(Libs[index].TheLibHandle);
  end;
Libs.Free;[/s]
[edit] seh grad, daß da zwei Listen (Libs und FList) parallel verarbeitet werden
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 12:54
Zitat von himitsu:
FreeLibrary erzeugt von sich aus aigentlich nur selten eine Exception.
Wird vielleicht innerhalb der DLL, beim Entladen, auf etwas anderes zugegriffen, welches zu diesem Zeitpunkt schon entfernt wurde?
Das könnte sein, Freelibrary macht ein Detach Process ja?

Aber wie kommt dann die Zugriffsverletzung in hoch? Die kann doch eigentlich nicht von dem DLL in das Pragramm rüber, oder?

EDIT1: Nur ATTACH_PROCESS getriggert, also das kann es nicht sein.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 13:03
Laufen die Finalisierungen der DLL nicht im selben Thread ab, von wo aus auch FreeLibrary aufgerufen wurde?
Dann müßten die Exceptions in der DLL doch im selben Kontext ablaufen, also auch in der EXE zu spüren sein.
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#7

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 13:44
Zitat von himitsu:
Laufen die Finalisierungen der DLL nicht im selben Thread ab, von wo aus auch FreeLibrary aufgerufen wurde?
Dann müßten die Exceptions in der DLL doch im selben Kontext ablaDoch eigentlich isteufen, also auch in der EXE zu spüren sein.
+

Die Anwendung hat nur einen Thread. Ok.

Edit 1: Es ist aber kein Problem sowas in Finalization zu machen ja? ich darf den Fehler als woanders suchen?

Edit 2: Das ist auch in der IDE keine Problem?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#8

Re: FreeLibrary oder UnloadPackage in Finalization

  Alt 26. Feb 2010, 17:07
Ok Ich habe es....

....
Die DLL nutzt Sharemem....und im Testprojekt habe ich vergessen die sharemem Unit als erstes einzubinden...
...
die Stelle an der der Fehler passiert ist vermutlich eher Zufall gewesen....

man möge mich steinigen.

Auf die Uhr seh...wie teuer war der Fehler jetzt ? so ein scheiß
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz