leider bringt deine Demo bei mir auch eine Zugriffsverletzung beim freigeben der liste (wie bei mir)
mir wurde schon von einigen namhaften Programmiern von Interfaces abgeraten oder ich sollte die auf COM-Art laden (RegSvr32 bzw. registerServer-methode). Dies will ich aber vermeiden, da dies zu sehr ins System eingreift...
Trotzdem Danke
naja, ich hab das mit den interfaces so ziemlich aufgegeben. Werde mein Plugininterface wohl auf simple Funktions-Pointer aufbauen, die das Plugin von der Haupt-Anwendung abfragen kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function GetFunctionPointer(ID:Integer):Pointer; begin case ID of Func_AddToToolbar:result:=@AddToToolbar; ... end; end; |
der Zeiger auf diese allwissende Funktion wird dem Plugin beim Init mitgegeben, welche sich den Pointer natürlich merkt. hab da schon bisschen rumprobiert, ist relativ übersichtlich und einfacher zu handhaben. in der hauptanwendung brauch ich dann eigentlich nur das dllHandle zu halten (bräuchte ich noch nichtmal ne separate klasse oder ein record, werde aber schon eine listenklasse machen, was die plugins verwaltet, läd, entläd und infos abfragt).
Der rest lässt sich dann von der dll abfragen (version,sonstige infos, dllName (GetModuleName) ).
Somit lässt sich das auch ohne größeren Aufwand erweitern, ist zwar kein OOP aber ist nicht so viel Overhead und somit auch schneller implementiert. Sollte auch stabiler laufen, naja, werd ich sehen
bei den Pointern kann das Plugin zwar nur zwischen nil und funktionspointer unterscheiden und muss das "Casting" selbst übernehmen, aber es sollte ja wissen, was es eine Zeile weiter oben angefordert hat
Von daher sollte man halt nur vermeiden, die funktionen nachträglich zu ändern (parameter, resulttyp), wenn man sie im pluginsystem integriert hat, den MM von delphi außen vor lassen (PChar statt strings, keine klassen, etc) und per stdcall hantieren.
Leider hab ich noch keinen Weg gefunden, um Methoden zu übergeben (@Memo1.Clear funktioniert natürlich so nicht)...vielleicht gibts diesbezüglich noch tricks.
Diese Ausführung nur für diejenigen, die sich auch überlegen, ein einfaches aber mächtiges Pluginsystem zu erstellen.
Gruß Frank
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3