Autor Beitrag
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.08.08 08:53 
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 10:03 
Wie wird denn die Form aus der DLL geschlossen?
Wird dabei auch die DB-Verbindung entsorgt?
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.08.08 10:17 
Also so rufe ich die Form aus der DLL auf

ausblenden 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


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 27.08.08 10:23 
Gibst du das Formular auch irgendwo wieder frei?

_________________
PROGRAMMER: A device for converting coffee into software.
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: 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.
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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?


Zuletzt bearbeitet von ensacom am Mi 27.08.08 10:39, insgesamt 1-mal bearbeitet
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 10:38 
ausblenden 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.
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 10:44 
Was tut denn deine Klasse Tfrm_Adressarten? Ich denke da liegt der Hund begraben.
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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?
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.08.08 10:54 
im onClose der Form in der DLL habe ich das stehen

ausblenden 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)


Zuletzt bearbeitet von ensacom am Mi 27.08.08 11:00, insgesamt 1-mal bearbeitet
Mike19
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Mi 27.08.08 10:59 
hier mal ein Beispiel, wie ich es mache, man sol mich des Besseren belehren.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.

ausblenden 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 ;)

_________________
PROGRAMMER: A device for converting coffee into software.
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 11:27 
Indem du sie von der Hauptform in die DLL-Funktion als Parameter übergibst.