Entwickler-Ecke

Dateizugriff - Fehler beim Beenden eines Programms das eine DLL lädt


Delete - Mi 27.08.08 08:53
Titel: Fehler beim Beenden eines Programms das eine DLL lädt
Hallo, ich lade eine DLL in der sich ein Formular befindet.
Mit diesem Formular greife ich auf eine MySQL Datenbank zu was auch alles super klappt. (mysqldirect)

Ich kann das Formular super über mine Anwendung starten und benutzen, nur wenn ich meine Hauptanwendung schließe
bekomme ich immer folgende Fehlermeldung.

Exception EAccessViolation in module ntdll.dll at 00061861.
Access violation at adress 771A1861 in module 'ntdll.dll'. Read of
adress 02010044.

im OnCreate meiner Form in der DLL habe ich unter anderem folgendes stehen.

Delphi-Quelltext
1:
EmbeddedConnection.Connected := true;   //Zur Datenbank verbinden                    

Kommentiere ich diese Zeile aus dann kann ich mein Programm ohne Fehlermeldung beenden nur kann ich dan eben mein Formular aus der DLL nicht nutzen weil ja keine Datenbankverbindung besteht.

Woran kann das liegen?

Danke

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 27.08.2008 um 09:51


iKilledKenny - Mi 27.08.08 10:03

Wie wird denn die Form aus der DLL geschlossen?
Wird dabei auch die DB-Verbindung entsorgt?


Delete - Mi 27.08.08 10:17

Also so rufe ich die Form aus der DLL auf


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
implementation

{$R *.dfm}

procedure ShowParameterForm;stdcallexternal 'Module\parameter.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowParameterForm;
end;



Das ist die Procedure in der DLL



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ShowParameterForm; stdcall;
begin
  frm_Adressarten := Tfrm_Adressarten.Create(nil);
  try
    frm_Adressarten.ShowModal;
  finally
    frm_Adressarten.EmbeddedConnection.Connected := False;
  end;
end;






exports
  ShowParameterForm;




Datenbank schließe ich im onDestroy des Formulars in der DLL


Xentar - Mi 27.08.08 10:23

Gibst du das Formular auch irgendwo wieder frei?


Delete - Mi 27.08.08 10:23

Nein, wo macht man das denn?
Ich dachte das geht automatisch wenn ich es schließe.


Also ich hab es mal mit einer showmessage getestet.
Das frm_Adressarten.Release; aus der procedure ShowParameterForm wird beim schließen des Formulars aus der dll auf jeden Fall aufgerufen.


Kann ich eigentlich irgendwie aus der Form in der DLL auf eine Datenbankkomponente meiner Hauptanwendung zugreifen?
Wie geht das?

Danke


Mike19 - Mi 27.08.08 10:32

Hallo,

ich habe mir angewöhnt, alle Formulare welche durch eine DLL erzeugt werden durch FreeAndNil wieder freizugeben. Dadurch habe ich auch keine Fehlermeldungen mehr beim Shliessen und wieder neu Öffnen.


Delete - Mi 27.08.08 10:33

und wo genau gibst du die dann frei?
Macht das niht mein frm_Adressarten.Release;?


freeandnil gibts bei mir gar nicht
es gibt nur freeonrelease


Habe anstatt frm_Adressarten.Release; frm_Adressarten.FreeOnRelease benutzt
Nun bekomme ich keinen Fehler beim schließen meiner Hauptanwendung mehr, aber dafür höre ich immer einen Ton wie bei Falscheingaben.
Wie kann ich den unterdrücken und wieso kommt der?


iKilledKenny - Mi 27.08.08 10:38


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure ShowParameterForm; stdcall;
begin
  frm_Adressarten := Tfrm_Adressarten.Create(nil);
  try
    frm_Adressarten.ShowModal;
  finally
    frm_Adressarten.Free;
  end;
end;


Das Schliessen der DB-Verbindung würde ich im OnClose/OnDestroy der Tfrm_Adressarten machen.


Delete - Mi 27.08.08 10:41

Also wenn ich dein Beispiel verwende, also nur free;
dann bekomme ich die Fehlermeldung auch. Mit FreeOnRelease bekomme ich wie gesagt die Fehlermeldung nicht aber eben diesen Ton wie wenn man eine Falscheingabe macht.

Wie bekomme ich den Ton weg und wieso bekomme ich ihn?


iKilledKenny - Mi 27.08.08 10:44

Was tut denn deine Klasse Tfrm_Adressarten? Ich denke da liegt der Hund begraben.


Delete - Mi 27.08.08 10:50

Nicht viel. ist eine ComboBox in die Daten aus einer Datenbank geladen werden.
Beim onSelect der ComboBox werden Daten aus einer Datenbank in eine ListBox geladen.

Dann noch ein paar Funktionen zum erstellen, bearbeiten und löschen von Datensätzen.

Habe ja alles schonmal einzeln auskommentiert, erst als ich den Eintrag EmbeddedConnection.Connected := True;
auskommentiert habe lief es ohne Fehler. Allerdings bekomme ich dann auch nichts angezeigt weil ja die DBConnection fehlt.

Kann ich irgendwie auf die Datenbankkomponente meiner Hauptanwendung zugreifen?


iKilledKenny - Mi 27.08.08 10:52

Was tust du beim Entsorgen der Form (destructor, OnDestroy, OnClose...)? Halt die üblichen Verdächtigen. Wird an einer dieser Stellen deine DB-Verbindung wieder geschlossen?

Was für eine DB-Verbindung ist das überhaupt?


Delete - Mi 27.08.08 10:54

im onClose der Form in der DLL habe ich das stehen


Delphi-Quelltext
1:
  EmbeddedConnection.Connected := False;                    


Das schließt die Verbindung zur Datenbank

Es handelt sich um eine Embedded MySQL Datenbank.
Ich benutze die Zeos Komponenten (TZConnection und TZQuerry)


Mike19 - Mi 27.08.08 10:59

hier mal ein Beispiel, wie ich es mache, man sol mich des Besseren belehren.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure FPEcreate; stdcall;
begin

 FPE:=TFPE.Create(nil);
 FPE.ShowModal;
 FreeAndNil(FPE);
end;

exports
FPEcreate;


damit gebe ich die erzeugte Form und alle Inhalte frei, bisher ohne Probleme.


iKilledKenny - Mi 27.08.08 11:05

OFFTOPIC @Mike19:
Kein Unterschied zu meinem Vorschlag mit .Free;, da die Variable FPE nach FreeAndNil nicht mehr benutzt wird.

ONTOPIC:
Ich würde an deiner Stelle alles, außer dem Connected := True; und dem Connected := False; mal auskommentieren. Ich kann mir nicht vorstellen, dass es daran liegt.

Ansonsten kann ich nicht viel mehr sagen, da ich die ZEOS nocht kenne.


Xentar - Mi 27.08.08 11:19

user profile iconMike19 hat folgendes geschrieben:
hier mal ein Beispiel, wie ich es mache, man sol mich des Besseren belehren.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure FPEcreate; stdcall;
begin

 FPE:=TFPE.Create(nil);
 FPE.ShowModal;
 FreeAndNil(FPE);
end;

exports
FPEcreate;


damit gebe ich die erzeugte Form und alle Inhalte frei, bisher ohne Probleme.


*belehr*
Gewöhn dir noch ein try...finally...end; an ;)


Delete - Mi 27.08.08 11:20

Das habe ich gemacht. es liegt also eindeutig an diesem connect
Es funktioniert alles nur beim beenden bekomme ich den Fehler.

Kann mir einer sagen wie ich aus meiner DLL-Form auf Komponenten der Hauptform zugreifen kann?


iKilledKenny - Mi 27.08.08 11:27

Indem du sie von der Hauptform in die DLL-Funktion als Parameter übergibst.