dll nach Absturz freigeben
-
Hallo,
ich entwickle momentan mit dem BDS2006 ein kleines Prog das mit einer dll arbeitet.
Beim FromCreate lade ich die dll mittels LoadLibrary und beim FormClose gebe ich sie wieder mittels FreeLibrary frei.Nun mein problem: Da sich das Porg noch in der Entwicklung befindet kommt es hin und wieder zu Prog- abstürzen. Dabei wird die dll nicht wieder freigegeben.
Gibt es eine möglichkeit ausser Pc Neustart die dll nachträglich freizugeben? Gibt es eine Option im BDS die das automatisch macht?
-
Hallo
Du könntest die DLL statisch linken, dann ersparst du dir nicht nur das LoadLibrary sondern Windows passt selber auf die Verbindung auf.
Kannst du nicht statisch linken must du eben nach dem RAII-Prinzip arbeiten. Und da du eh nicht OnCreate und OnClose benutzen solltest verlege das Laden (und alles andere auch) in den Konstruktor des Forms und das Freigeben in den Destruktor.Noch sicherer wird es wenn du die DLL-Beziehung aus dem Form ganz auslagerst und direkt über die Hauptorjektdatei (<Projektname>.cpp) in der main-Funktion erledigst.
bis bald
akari
-
Das laden und freigeben steht schon im Konstruktor und Destr. ich nenn es immer nur noch OnCreate bzw OnClose, sorry.
Was genau meinst du mit auslagern in die Projekt cpp? Und warum wird das dann noch sicherer?
Ich hab es mit Exception Handling versucht, aber dann stürzt der ganze Rechner komplett ab.
-
Hallo
kingvik387 schrieb:
Was genau meinst du mit auslagern in die Projekt cpp? Und warum wird das dann noch sicherer?
Auch VCL-Projekte haben eine main-Funktion in der besagten Quellcodedatei. Darin wird normalerweise nur das Initialieren und Ausführen des Applipation-Objektes gemacht. Aber du kannst auch eigenen Code ausführen. Zum Beispiel das Laden und Entladen von DLLs. Der Vorteil ist das du dann nicht mehr davon abhängig bist das das Application-Objekt selber sauber beendet wird (Der Form-Destruktor wird nur dann sauber aufgerufen wenn auch Application sauber gelöscht wird).
Natürlich must du nun die in der main-Funktion geladenen Funktionspointer an das Form geben. Du könntest dem Form zum Beispiel entsprechende Membervariablen geben.bis bald
akari
-
Und diese main Funktion wird immer korrekt zu ende geführt?
-
Hallo
im catch-Block oder nach dem catch-Block ja.
Wenn natürlich Windows das Programm auf die harte Tour beendet ("Keine Rückmeldung...") dann hilft das auch nicht.bis bald
akari
-
Ok danke erst mal, das test ich mal an.

-
Verdammt das tut auch nicht, da ich das Prog im Fehlerfall mit Strg+F2 abbreche.

Gibt es noch eine möglich die dll nachträglich freizugeben? Vielleicht ein nettes kleines Win Tool?
Aber immerhin konnte ich den Fehler eingrenzen, wobei ich auf das nächste Problem stosse
. Worin liegt der Unterschied zwischen dem Aufruf einer Funktion innerhalb eines Ereignisses (ButtonClick) und dem Aufruf einer CALLBACK- Funktion eines hochauflösendem Timer? Ich weiss daraus könnte man schon ein neuen Thread im Forum machen, sorry.