![]() |
ListBox als TObject an Dll-PlugIn
Hallo,
ich versuche gerade, eine PlugIn-Schnittstelle zu konstruieren. Allerdings im Moment noch ohne Interface's. Die Kommunikation mit der Dll funktioniert auch, und bringt erstmal keine Probleme. Ich habe zusätzlich in der Dll einen Eventhandler drin, den die Applikation beispielsweise bei einem Klick aufruft. Speziell befindet sich in der Applikation eine TListBox, bei der die OnClick-Methode wie folgt genutzt wird:
Delphi-Quellcode:
In der Dll wird das Event wie folgt verarbeitet:
procedure TForm1.ListBox1Click(Sender: TObject);
begin Self.RunEvent(evnClickItem, Sender); end; function TForm1.RunEvent(EventNotification: TEventNotification; Sender: TObject): Boolean; // ... if FPlugIns[I].PlugIn.EventHandler(EventNotification, Sender) = evnAbort then // ... end;
Delphi-Quellcode:
Wie man sieht, macht die Funktion nicht wirklich was sinnvolles, aber zu Demonstrationszwecken reicht es.
function TPlugTest.EventHandler(EventNotification: TEventNotification;
Sender: TObject): TEventAction; Var ListBox1 : TListBox; begin if ( EventNotification = evnClickItem ) then begin ListBox1 := TListBox(Sender); ListBox1.Items.Strings[ListBox1.ItemIndex] := ListBox1.Items.Strings[ListBox1.ItemIndex] + '1'; end; Result := evnOk; end; Was ist nun das Problem?! Das ganze funktioniert leider nur 4 Mal. D.h. ich klicke zum Testen immer wieder auf das gleiche Element. Beim fünften Mal ( also 4 Einsen wurden schon angehangen ), kommt auf einmal eine Access Violation. Jemand eine Idee, woran das Liegen kann ? |
Re: ListBox als TObject an Dll-PlugIn
Beim austausch von Objekte zwischen Exe und DLL kommt es immer dann zu Problemen wenn keine gemeinsamen Laufzeitpackages verwendet werden, da dann sowohl Exe als auch DLL ein eigenes Objektmodell instanziieren und TObject der DLL <> TObject der Exe ist. Dies kracht sofort wenn man die Exe und die DLL mit unterschiedlichen Compilerversionen, unterschiedlichen Compileroptionen oder unterschiedlichen Versionen der Sourcen kompiliert.
|
Re: ListBox als TObject an Dll-PlugIn
Allerdings handelt es sich in dem Fall ja um den gleichen Compiler.
Zumal es ja auch erst nach einer Weile kracht, und nicht direkt beim ersten Mal. Das ist halt die Sache, die ich im Moment nicht ganz verstehe. |
Re: ListBox als TObject an Dll-PlugIn
Sorry, aber eine DLL, die Objekte exportiert ist doch witzlos. ;)
Da du somit sowieso auf Delphi beschränkt bist, kannst du genausogut Packages nehmen. So kannst du ganz easy Klassen, Interfaces und Funktion in deiner Anwendung aufrufen. ;) |
Re: ListBox als TObject an Dll-PlugIn
Darum geht es mir ja an der Stelle nicht. Das ganze soll ja später über Interfaces ablaufen.
Auf gut deutsch ist das nichts weiter als ein Test. Und logisch gesehen sollte dies ja auch so funktionieren; unabhängig davon, wie effektiv das ist. |
Re: ListBox als TObject an Dll-PlugIn
Nö, das ist viel krasses.
Schließlich musst du auf beiden Seiten ShareMem als MemoryManager nehmen, damit du überhaupt eine Chance hast, dass sich deine App nicht jede Sekunde in Wohlgefallen auflöst. ShareMem ist aber bekannt dafür genau den gleichen Effekt zu haben. Suche mal in den Borland NGS (Delphi.language.basm oder so :gruebel: ) nach dem FastMM. Google könnte auch was finden: ![]() Im Gegensatz zu Borlands buggy ShareMem ist es FastMM relativ egal welcher MM auf der anderen Seite (also deine APP) arbeitet. |
Re: ListBox als TObject an Dll-PlugIn
Zitat:
Zitat:
|
Re: ListBox als TObject an Dll-PlugIn
Zitat:
Und noch einen Vorteil hat FastMM. Es ist eine Memory-Checker eingebaut mit dem man sehr schnell Speicherlöcher oder genutzte Objekte nach der Freigabe erkennen kann. Außerdem ist er um einiges Schneller. |
Re: ListBox als TObject an Dll-PlugIn
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 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