Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem beim Beenden (DLL mit Formular und mODBC) (https://www.delphipraxis.net/99441-problem-beim-beenden-dll-mit-formular-und-modbc.html)

peschai 2. Okt 2007 06:42

Re: Problem beim Beenden (DLL mit Formular und mODBC)
 
Hallo
unsere Antworten haben sich überschnitten ...

Eventuell hilft dir punktuell
Delphi-Quellcode:
if Assignd(Form1) then
  begin
    FreeAndNil(Form1)
  end;
..Aber in deiner Programmgesamtlogic stimmt noch etwas nicht:
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 ?

StTüff 2. Okt 2007 06:43

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

StTüff 2. Okt 2007 06:47

Re: Problem beim Beenden (DLL mit Formular und mODBC)
 
Hallo!

Aktueller Stand:
Delphi-Quellcode:
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;
Beim Laden erzeugen, beim entladen freigeben.

Gruß,

StTüff

Edit:
Im ursprünglichen Beispiel:
Delphi-Quellcode:
initialization
begin
  Form1:=TForm1.Create(nil);
end;

finalization
begin
  Form1.Free;
end;
In der Datei DataMain.pas.... Macht aber keinen Unterschied.

peschai 2. Okt 2007 06:58

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.

peschai 2. Okt 2007 07:03

Re: Problem beim Beenden (DLL mit Formular und mODBC)
 
Hallo
du gibst Form1 an zwei stellen frei ohne vorherige Prüfung mit Assigned!

StTüff 2. Okt 2007 07:05

Re: Problem beim Beenden (DLL mit Formular und mODBC)
 
Hallo!

Zitat:

Für die Freigabe ist normalerweise der Owner zuständig...und eventuell passiert das bereist und du bekommet deshalb den Absturz...
Da mODBC eine Komponente ist, die auf dem Formular platziert wurde, gehe ich davon aus, dass der Owner das Formular ist. Das Formular wiederum hat keinen Owner, da ich dieses selbst erzeuge und freigebe.
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....

peschai 2. Okt 2007 07:24

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?).
Das Freigeben bzw. beenden des Formulars hat nichts mit dem entladen des Moduls zu tun.
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)

peschai 2. Okt 2007 07:36

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;

StTüff 2. Okt 2007 07:41

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

StTüff 2. Okt 2007 08:32

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.
Seite 2 von 3     12 3      

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