Also wie bereits in vorherigen Threads erwähnt bastel ich gerade ein Pluginsystem. Dieses Pluginsystem funktioniert grob wie folgt:
Plugins und Kern der Anwedung liegen als bpl vor - eine EXE Datei welche den Kern läd und anzeigt.
Kern:
* eine einfache Form mit 2 Buttons.
Plugin
* TPlugin ist eine selbst erstellte Klasse welche von einer anderen eigenen Klasse abgeleitet wurde
TPlugin = class(TPluginClass)
* exportiert die Funktion
LoadPlugin(var Plugin: TPlugin);
Kern wird angezeigt und
beim starten die Plugins geladen, sprich die Methode LoadPlugin wird ausgeführt.
Wie zu erkennen ist erhalte ich nach dem Laden des Plugins eine Variable von seiner Klasse (welche registriert wurde). Diese Klasse hat Eigenschaften wie Author, Datum etc., aber auch Funktionen wie Init(); und Exec();
Nach dem Aufruf von LoadPlugin rufe ich nun Init des Plugins auf, in welcher Prozedur die Eigenschaften wie Author etc. befüllt werden, anschließend lasse ich mir den Author via. ShowMessage() zurück geben. Dies Funktioniert alles Problem los.
Das Plugin welches ich durch LoadPlugin erhalten habe lege ich in einem Array ab welches bestandteil des s.g. PluginManager's ist.
Das Komische ist nur ich kann nicht im Nachhinein eine Funktion/Prozedur eines Plugins aufrufen. Sprich:
PluginManager.Plugin[0].Plugin.Init();
funktioniert nicht -
hingegen funktioniert aber folgendes:
ShowMessage( PluginManager.Plugin[0].Plugin.Author );
Fehlermeldung beim Aufrufen im Nachhinein:
Zitat:
---------------------------
Debugger
Exception Notification
---------------------------
Project Main.exe raised
exception class EAccessViolation with message '
Access violation at address 009C2616 in module 'Kernel.bpl'. Read of address 009D1D04'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.