![]() |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo
unsere Antworten haben sich überschnitten ... Eventuell hilft dir punktuell
Delphi-Quellcode:
..Aber in deiner Programmgesamtlogic stimmt noch etwas nicht:
if Assignd(Form1) then
begin FreeAndNil(Form1) end; Für die Freigabe ist normalerweise der Owner zuständig...und eventuell passiert das bereist und du bekommet deshalb den Absturz... Wo und wie erzeugst du dass Formular ? |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo!
Ich kann doch jetzt noch nicht wissen, wie die DLL verwendet wird. Bei meinem Beispielprojekt macht es keinen Unterschied, ob die DLL dynamisch, oder statisch geladen wird. "DLL_PROCESS_ATTACH" wird immer beim laden der DLL (egal ob staisch, oder dynamisch) aufegerufen und "DLL_PROCESS_DETACH" immer beim entladen. Vielleicht habe ich aber auch Deine Bemerkung nicht richtig verstanden. Gruß, StTüff |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo!
Aktueller Stand:
Delphi-Quellcode:
Beim Laden erzeugen, beim entladen freigeben.
procedure DLLMain(Reason: Integer);
begin case Reason of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); Form1:=TForm1.Create(nil); end; DLL_THREAD_ATTACH: ; DLL_THREAD_DETACH: ; DLL_PROCESS_DETACH: begin FreeAndNil(Form1); //Problem bei mSession finalization !!!!!!!!!!!1 end; end; Gruß, StTüff Edit: Im ursprünglichen Beispiel:
Delphi-Quellcode:
In der Datei DataMain.pas.... Macht aber keinen Unterschied.
initialization
begin Form1:=TForm1.Create(nil); end; finalization begin Form1.Free; end; |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo
Weitere zusatzinfo: Per defintion wird die Finalization section als letztes aufgerufen, quasi beim entladen des Moduls. Das kann nicht geändert werden und das darf auch nicht geändert werden. |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo
du gibst Form1 an zwei stellen frei ohne vorherige Prüfung mit Assigned! |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo!
Zitat:
Ich wäre jetzt davon ausgegangen, dass beim zerstören des Formulars das Modul entladen wird. Offensichtlich geschieht das aber erst später (abhängig von was?). Sollte ich beim Erzeugen des Formulars vielleicht einen Owner angeben? Aber welchen? Gruß und vielen Dank für die Hilfe! StTüff PS: In meinem aktuellen Projekt gibt es nur 1 mal "free" bzw. FreeAndNil und ich glaube im Beispiel alleine auch nicht mehrmals. Ich hatte in der Nachricht nur zwei verschiedene Möglichkeiten genannt, deshalb sieht es vielleicht so aus.... |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo
Zitat:
Das Entladen des Moduls (DLL) passiert immer als letztes! Beim statischen Linken von Dll's werden diese vom Betriebssystem automatisch bei Programmstart geladen und beim Beenden des Programms (.exe) wieder entladen. Das hier ist meiner Meinung nach auch das richtige für dich. Beim dynamische Linken schreibst du Code, der die DLL lädt und must dementsprechend auch wieder Code schreiben zum Entladen (stichwort LoadLibrary, DLLReferenzZähler sollte dir hier etwas sagen, sonst bitte nachlesen) |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo
und bitte als guten stil verwende ich persönlich immer FreeAndNil und das als paar mit der abfrage auf Assigned.
Delphi-Quellcode:
if Assignd(Form1) then
begin FreeAndNil(Form1) end; |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo!
Das erklärt zwar auf der einen Seite das Verhalten, dass der Fehler erst beim Beenden des Aufrufenden Programms auftritt, die Frage ist aber, was kann ich tun um das Problem zu beseitigen. Wie im letzten Besipiel gezeigt, versuceh ich das Fromular erst beim Entladen freizugeben. Offensichtlich (wie Du ja auch geschrieben hast) ist das entladen des Moduls immer das letzte. Damit habe ich 2 neue Fragen: 1. Warum passiert das nicht wenn ich mODBC in einer normalen GUI Anwendung (EXE) verwende. 2. Ist das dann ein Fehler in mODBC? Gruß, StTüff |
Re: Problem beim Beenden (DLL mit Formular und mODBC)
Hallo!
Ich habe mir mal den Quellcode angeschaut. Eventuell ist es ein grundsätzliches Problem, dass es kein Application-Objekt gibt?! Im Quellcode von mODBC taucht immer mal wieder "Application." auf. Kann da jemand was dazu sagen? Gruß, StTüff |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz