Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Komponente als PlugIn - geht das?
freedy - Di 05.08.08 14:48
Titel: Komponente als PlugIn - geht das?
Hallo Forum!
Zur Zeit arbeite ich daran, mein Programm zu entschlacken und Komponenten, die sehr viel Speicher benötigen, aber nicht von jedem Anwender benötigt werden, auszulagern. Das schreit förmlich nach einem PlugIn-System, richtig. Für ein fertiges, sprich kommerzielles, reicht mein Budget leider nicht. Daher möchte ich es doch selbst versuchen.
Hier nun konkret die Stelle, wo ich feststecke:
Für eine anpassbare Oberfläche erstelle ich mir Templates. Diese Templates laden sich aus XML die Oberfläche zusammen und erzeugen die einzelnen Klassen. Bisher habe ich das so gemacht, dass ich die Klassen, die benötigt werden, mit "RegisterClass" in der Unit registrierte habe. Damit konnte ich alle Templates laden und speichern.
Nun habe ich die erste Komponente testweise in eine DLL gepackt und komplett aus meiner Template-Unit rausgeworfen. Diese ruft nur noch die exportierte Funktion "RegisterClasses" aus der DLL auf. Die Klasse wird auch registriert. Allerdings klappt es nicht. Logisch, die Speicherbereiche für die registrierten Klassen unterscheiden sich auch.
Was ist falsch bzw. wie komme ich da weiter? Dürfte doch eigentlich nicht schlimm sein, denn irgendwelche Frameworks können das doch auch.
Grüße,
freedy
PS: natürlich habe ich die Suche benutzt. Leider bin ich so konkret nicht fündig geworden.
Wollt ihr Code sehen? Ist bisher noch nicht sonderlich spektakulär. ;-)
freedy - Fr 07.11.08 16:46
So,
nach einer Woche Arbeit habe ich nun endlich eine Version, mit der einigermaßen gearbeitet werden kann. Sprich:
- Units, die für eine Komponente benötigt werden, werden in eine DLL kompiliert
- eine spezielle Komponente "durchleuchtet" alle Dateien mit meiner spezifischen Endung, ob es gültige Plugins sind
- wenn ja werden die dort enthaltenen Klassen in der Hauptanwendung registriert
Jetzt gibt es aber doch noch ein Problemchen: Das Ganze funktioniert nur, wenn ich meine Projekte mit Laufzeit-Packages kompiliere. Der Grund liegt auch klar auf der Hand. Die Basisklassen sind in der VCL definiert. Wenn nun meine Hauptanwendung die VCL und RTL statisch einbindet und die geladene DLL ebenfalls statisch oder sogar dynamisch damit verbunden wird, entstehen ja zwei verschiedene Speicherbereiche. Dies erklärt auch die Fehlermeldung "TFont kann nicht TFont zugewiesen werden." Auch wenn die Klassen gleich heißen, sind sie ja eben nicht gleich.
Gibt es nicht eine einfache Möglichkeit, den DLL bereits benutzen Speicherbereich zugänglich zu machen? Wie das auch immer geschehen kann... Eben da fehlt mir eine gute Idee, die noch relativ leicht umzusetzen wäre. Hat jemand damit Erfahrung? Würde den Plugin-Code dann auch zugänglich machen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!