AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem beim Beenden (DLL mit Formular und mODBC)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Beenden (DLL mit Formular und mODBC)

Offene Frage von "StTüff"
Ein Thema von StTüff · begonnen am 12. Sep 2007 · letzter Beitrag vom 4. Okt 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#11

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

  Alt 2. Okt 2007, 06:42
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 ?
Peter Schaible
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#12

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

  Alt 2. Okt 2007, 06:43
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#13

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

  Alt 2. Okt 2007, 06:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#14

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

  Alt 2. Okt 2007, 06:58
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.
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#15

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

  Alt 2. Okt 2007, 07:03
Hallo
du gibst Form1 an zwei stellen frei ohne vorherige Prüfung mit Assigned!
Peter Schaible
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#16

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

  Alt 2. Okt 2007, 07:05
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....
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#17

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

  Alt 2. Okt 2007, 07:24
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)
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#18

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

  Alt 2. Okt 2007, 07:36
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;
Peter Schaible
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#19

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

  Alt 2. Okt 2007, 07:41
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#20

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

  Alt 2. Okt 2007, 08:32
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:12 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