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 1 von 3  1 23      
StTüff

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

Problem beim Beenden (DLL mit Formular und mODBC)

  Alt 12. Sep 2007, 10:22
Hallo zusammen!

Ich poste diesen Thread in "Sonstige Fragen zu Delphi", weil ich mir nicht ganz sicher bin, wo das Thema einzuordnen ist.

Ich möchte eine DLL erstellen, die mir Daten aus einer Datenbank (die nur per ODBC erreicht werden kann) aufbereitet und zur Verfügung stellt. Die DLL wird später dann in Verbindung mit diversen Scriptsprachen verwendet. Für den Datenzugriff verwende ich mODBC. Da der Anwender noch einige Einstellungen vornehmen muss, verwende ich in der DLL auch ein VCL-Formular, auf dem auch die Datenbankzugriffskomponenten platziert sind.

Um es etwas klarer zu machen, habe ich gleich ein Beispielprojekt angehängt.
Es beinhaltet den Quellcode der DLL + eine Exe-Datei, welche die exportierte Funktion aufruft (nach einem Click auf den Button). Als Datenquelle kann zum Testen eine beliebige ODBC-Datenquelle verwendet werden.

Das Problem entsteht erst beim Beenden. Wenn ich Form1.free aufrufe gibt es eine Speicherschutzverletzung und es wird ein Runtime-Error angezeigt. Verzichte ich auf das free, so erhalte ich keine Fehlermeldung, das Formular wird dann aber auch nicht korrekt freigegeben.

Ich vermute, dass es mit der Reihenfolge zu tun hat in der die einzelnen Bestandteile freigegeben werden. Mir ist aber weder klar, wie ich das herausfinden, noch wie ich das lösen/beeinflussen kann.

Ich habe schon versucht dass Fromular zu verschiedenen Zeitpunkten frei zu geben: ohne Erfolg.

Vielleicht hat jemand eine Idee dazu....

Gruß und schon mal vielen Dank,

StTüff
Angehängte Dateien
Dateityp: zip perport_141.zip (227,0 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
StTüff

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

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

  Alt 18. Sep 2007, 14:12
Hallo!

Hat sich das schon mal jemand angeschaut? Ich wäre auch an der Info interessiert, wenn das Problem nicht nachvollzogen werden konnte. Vielleicht ist es ja ein spezielles Problem an meinem Rechner? Ich glaube aber eher, dass ich einen kleinen aber entscheidenden Fehler gemacht habe (mal wieder).

Gruß,

Stüff
  Mit Zitat antworten Zitat
StTüff

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

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

  Alt 1. Okt 2007, 13:08
Hallo!

Hat keiner 'ne Idee, Anregung, einen Link, oder eine Hinweis?
Momentan komme ich an der Stelle einfach nicht weiter. Ich implementiere nach und nach alle Funktionen in der DLL und hoffe, das es eine Lösung gibt. Wenn nicht bzw. wenn ich einen grundlegenden Fehler gemacht habe, sehe ich dann alt aus.

Ich bin also auch dankbar, wenn mich jemand darauf hinweist, dass ich einen Anfängerfehler gemacht habe...

Gruß,

StTüff
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#4

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

  Alt 1. Okt 2007, 13:21
hi StTüff,

habe mir Dein Projekt nicht genauer angeschaut, aber ich hatte ähnliche Probleme mit Formularen in DLLs.
Bis ich herausgefunden habe, daß DLL-Formulare geschlossen sein müssen beim Entladen der DLL !

Habe also einfach eine Procedure exportiert "CloseAllForms" oder so, welche alle DLL-Formulare schließt. Diese Procedure rufe ich auf beim Programmende vor Entladen der DLL.

Hoffentlich hilft's ?!

Gruß
blauweiss
  Mit Zitat antworten Zitat
StTüff

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

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

  Alt 1. Okt 2007, 13:36
Hallo blauweiss!

Danke für die Nachricht!
Ich werde mir das noch mal genau anschauen. Ich meine aber dass das so ist. Das Problem scheint zu sein, dass der finalize-Abschnitt der mODBC-Komponente erst abgearbeitet wird, nachdem ich das Formular mit free freigegeben habe. Dann "crashts" natürlich. Lasse ich das "free" weg, so gibt es keine Fehlermeldung, aber eigentlich sollte man das Formular, dass man erzeugt hat doch auch wieder freigeben.... (macht zwar unter XP - so glaube ich - nicht viel aus, aber sauber ist das nicht).

Mir sind jetzt 2 Dinge nicht ganz klar:
1. Wann wird der finalize-Abschnitt aufgerufen (im Vergleich DLL zu exe).
2. Wie kann die Reihenfolge festgelegt werden bzw. wie kann ich die Formulare nach dem Ablauf des finalize-Abschnitts freigeben.

Viellecht komme ich über diese Fragen zu einer möglichen Lösung

Gruß und besten Dank,

StTüff
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#6

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

  Alt 1. Okt 2007, 16:58
hallo StTüff,

habe mir Dein Projekt mal auf die Schnelle angeschaut, und mir ist aufgefallen, daß Du offenbar eben gerade NICHT das Formular schließst. Die exportierte Prozedur FreeDLL gibt das nicht-modale Formular nur frei, schließt es aber zuvor nicht !

Crasht es immer noch, wenn Du das DLL-Formular zur Laufzeit schließst, und dann erst das Hauptprogramm beendest ?

Gruss
blauweiss
  Mit Zitat antworten Zitat
StTüff

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

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

  Alt 2. Okt 2007, 06:08
Hallo blauweiss!

Es ist richtig, dass dies im Programmcode nicht zu finden ist. Ich habe das Formular aber bisher immer geschlossen (mit X), bevor ich das aufrufende Programm beendet hatte. Zur Sicherheit habe ich jetzt vor dem "free" noch Form1.close eingefügt => keine Änderung.

Hast Du das Programm nur angeschaut, oder auch mal getestet? Tritt der Fehler bei Dir auch auf?

Gruß,

StTüff.
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

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

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

  Alt 2. Okt 2007, 06:20
Hallo,

Grundsätzlich sollte man immer nur die Türen auch schliessen, welche man selber geöffnet hat und auch nur diese. Das soll heißen, daß du Form1.Free eventuell nicht aufrufen solltest, da dass Aufräumen der Forms normalerweise automatisch passiert. Wenn du es allerdings selber "Created" hast, dann OK.

Desweitern sollte in einer DLLAufräumRoutine auch nur das aufgeräumt werden, was in der DLL erzeugt wurde. Denke hier in Zonen, welche sich selber unabhängig verwalten.

Du solltest auch immer in der umgekehrten Reihenfolge aufräumen (FirstIn-LastOut)

Desweiteren sollte man anstelle MyObject.Free; besser verwenden FreeAndNil(MyObject); , Denn dabei wird die Variable MyObject auf NIL gesetzt. Das kannst du dann nutzen, indem du in deinen Methoden/Funktionen prüfst, ob das Object noch da ist, also eventuell in Finalization If Assigned(MyObject)then
Peter Schaible
  Mit Zitat antworten Zitat
StTüff

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

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

  Alt 2. Okt 2007, 06:35
Hallo peschai!

Danke für Deine Nachricht!
Leider möchte ich es eigentlich genau so machen, wie Du vorschlägst: Ich erzeuge das Formular und möchte es dann auch wieder freigeben. Leider ist es aber so, dass ich keinen Einfluss daruf habe, wann der finalize-Abschnitt der mODBC-Komponente aufgerufen wird (das mache ich nämlich nicht selbst). Ich gebe das Formular zum (mir) letzt möglichen Zeitpunkt (nämlich beim entladen der DLL) frei. Ich kann aber mit dem Debugger sehen, dass der Finalize-Abschnitt danach aufgerufen wird und es dann (logischer weise) zu dem Fehler kommt.
Genau das ist der Punkt, den ich 1. nicht verstehe und 2. keine Ahnung habe, wie ich das verhindern kann.

Warum wird der Finalize-Abschnitt erst nach dem Free des Formulars aufgerufen?
Wie kann ich dafür sorgen, dass erst der Finalize-Abschnitt aufgerufen wird und dann das Formular freigegeben wird?

Ich denke das sind die entscheidenden Fragen (wenn ich nicht noch was anderes komplett falsch gemach habe, was durchaus möglich ist).

Gruß und noch mal vielen Dank!

StTüff

PS: FreeAndNil bring in diesem Fall leider keine Abhilfe, auch wenn ich Dir ansosnten natürlich diesbezüglich recht gebe.
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

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

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

  Alt 2. Okt 2007, 06:36
Hallo

Zusatzanmerkungen:
Zitat:
Delphi-Quellcode:
procedure DLLMain(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH:
      begin
       DisableThreadLibraryCalls(hInstance);
       //CoInitialize(nil);
       
      end;
    DLL_THREAD_ATTACH:
        ;
    DLL_THREAD_DETACH:
      ;
    DLL_PROCESS_DETACH:
      begin
       //CoUnInitialize;
      // Form1.Free();
      end;
  end;

  if Assigned(DLLProcNext) then DLLProcNext(Reason);
end;

exports
  StartReport, FreeDLL;

begin
  DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain)));
  DLLMain(DLL_PROCESS_ATTACH);
end.
Kann es sein, daß du dynamisch DLL's laden und entladen hier vermischt mit statischem Laden Entladen ? Ich komme zu dieser Frage wegen deiner BEGIN section und dem exports FreeDLL.
Wenn Statisch, (also programstart, dann dll auto geladen und bei Programmende auto entladen)
dann würde ich dir empfehlen:
Delphi-Quellcode:
exports
  StartReport;
Initialization
  DLLMain(DLL_PROCESS_ATTACH);
  ...DLLProcNext...
Finalization
  ...DLLProcNext...
  DLLMain(DLL_PROCESS_DETACH);
end;
Peter Schaible
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 14:58 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