![]() |
Interface und Zugriffsverletzung
Liste der Anhänge anzeigen (Anzahl: 1)
Guten morgen,
ich habe mal versucht, mich bisschen mit Interfaces zu beschäftigen, da ich meinen DFM-Editor in näherer Zukunft mit Plugins ausstatten möchte. So wie es aussieht, eigenen sich interfaces dafür am besten. hab mir bezüglich Plugins folgendes durchgelesen: ![]() hier hat aber das plugin scheinbar nicht die Möglichkeit das Hauptprogramm zu steuern, was mit interfaces möglich ist. im folgenden Thread werden Interface-Plugins erläutert: ![]() der code scheint nicht ganz vollständig zu sein. es wird auch das problem mit der Zugriffsverletzung angesprochen, jedoch die "lösung" entfernt meine AV leider nicht :? genau sinds 2 Exceptions, eine beim freigeben der dll (scheinbar bereits freigegebenes Objekt) und eine beim beenden (nil-pointer, jedoch ist das app-objekt noch gültig). :gruebel: ich hänge mal das komplette Test-Programm an...hoffe es kennt sich jemand etwas besser aus und kann mir sagen, warum die exceptions kommen bzw. wie man diese entfernen kann. :stupid: Gruß Frank |
Re: Interface und Zugriffsverletzung
Hallo,
ohne jetzt überhaupt reinzuschauen ;) Interfaces unter Delphi sind COM-Interfaces. Die daranhängendenden Objekte werden "wild" freigegeben, wenn das Interface seine Gültigkeit verliert. Wird das Interface z.B. als lokale Variable definiert, wird nach Beenden der Methode auch das Objekt freigegeben. Da muss man dann Rumtricksen mit _AddRef und Release. Deine Interfaces müssen die beiden Methoden überschreiben und dort gar nichts tun, also keine Referenz hochzählen und Runterzählen. Das Interface muss dann selber wieder freigegeben werden (auf NIL setzen reicht wohl nicht). Ich bin da auch schön reingefallen. Ich wollte ein c# Bsp 1:1 nach Delghi übersetzen und hatte auch AV ohne Ende. Setze mal einen Breakpoint auf den Destructor der Klasse, dann siehst du, was ich meine. Heiko |
Re: Interface und Zugriffsverletzung
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
und wie geb ich das interface dann frei? free gibts ja nicht... Zitat:
Gruß Frank |
Re: Interface und Zugriffsverletzung
Hallo,
> ich seh nix beim Verlassen des Gültigkeitsbereiches eines Interfaces wird nicht nur das Interface "gelöscht", sondern auch das betroffene Objekt gelöscht. Abhilfe bringt nur _AddRef und Release zu überschreiben und dort nichts tun (Referenzzählung deaktivieren). Ein Interface wird normalerweise freigegeben, wenn es auf NIL gesetzt wird. Probier mal mit memcheck, ob das reicht. Ich hatte nach dem einen Test so die "Schnauze voll", dass ich erst wieder was mit machen werden, wenn delphi.net bei uns ansteht. Heiko |
Re: Interface und Zugriffsverletzung
Zitat:
Delphi-Quellcode:
die variable app:TApp ist im Gültigkeitsbereich der form, ist auch im destroy des forms korrekt gesetzt (inkl. Interface auf Ieditor), wo es dann freigegeben wird. Es kommt auch keine nil-pointer exception beim beenden mehr...
//anwendungsseite
function TApp._AddRef: Integer; stdcall; begin // end; function TApp._Release: Integer; stdcall; begin // end; function TMemoWrapper._AddRef: Integer; begin // end; function TMemoWrapper._release: Integer; begin // end; //plugin-seite function TPlugin._AddRef: Integer; begin // end; function TPlugin._release: Integer; begin // end; muss ich vor dem freigeben der dll das TPlugin-Objekt irgendwie freigeben, oder reicht das per nil-Zuweisung beim Interface anwendungsseitig? (habs zumindest nicht ohne AV hinbekommen) Zitat:
gibt sicher ne ganz triviale lösung...so umfangreich ist es ja (noch) nicht...kanns nur nicht richtig nachvollziehen, warum die AV kommt. Muss man evtl irgendwas festes bei den beiden funktionen zurückgeben? weil so sind die ja undefiniert... Gruß Frank |
Re: Interface und Zugriffsverletzung
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
mit _AddRef und _Release würde ich erst experimentieren, wenn ich mich gut mit Interfaces auskenne. Ich habe Dein Beispiel aus dem ersten Beitrag mal etwas überarbeitet und folgende Änderungen vorgenommen:
Gruß xaromz |
Re: Interface und Zugriffsverletzung
Zitat:
Zitat:
Zitat:
zu dem entkoppeln...muss ich mal schauen, wie ich das dann mache wenn ich zugriff auf mehrere Objekte brauche, momentan ists ja zum test nur das memo... Zitat:
hab zumindest erstmal einen funktionierenden startpunkt und paar Infos, den rest muss ich ausprobieren bzw. schauen, was ich so dazu finde :) werde mir den Source so nochmal in einer Ruhigen minute zu Gemüte führen, habs jetzt nur überflogen und die änderungen gesucht bzw. deine Punkte daran nachvollzogen (zumindest versucht) :) wird eh erst eingebaut, wenn (endlich mal) die Background-Klasse für den DFM-Editor fertig ist und eingebaut ist...ist auch massig Arbeit, das alles anzupassen. wollte das nur im vorfeld schonmal bisschen probieren. Dem Interface wird dann diese Background-Klasse übergeben, welche sich per Event um das Treeview kümmert und das Plugin rührt dann nicht in der vcl (wenn auch indirekt) rum... maximal bei Menüeinträgen, aber da muss aich auch schauen, wie ich das mit der toolbar (besonders den Glyphs) mache. Gruß Frank |
Re: Interface und Zugriffsverletzung
Hallo,
was das Mischen von Instanzen und Interfaces angeht kann ich Dich an meine ![]() Gruß xaromz |
Re: Interface und Zugriffsverletzung
Zitat:
1, Interfaces unter Delphi sind an COM angelehnt, aber funktionieren wunderprächtig auch Delphi-Intern und auch unter Linux (Kylix) 2, Sie werden (im Gegensatz zu .NET) nicht "wild" freigegeben (die "dahinterliegende" Instanz eines Objekts) sondern sofort wenn es keinen Interfacezeiger mehr darauf gibt (Referenzzählung). Nur wenn man den Tipp von xaromz (Keine Mischverwendung Instanzen und Interfaces) nicht berücksichtigt bekommst man Probleme mit der Delphi-Implementierung von Interfaces). Zitat:
Wenn man 2-3 Fallen der Delphi-Implementierung umschifft dann sind Interfaces in Delphi (im Gegensatz z.B. zu C/C++, auch mit Smartpointer) easy zu verwenden und auch sehr Pflegeleicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr. |
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