Plugin System



  • Hallo,

    Ich versuche zu meiner Library ein Plugin System hinzu zu bauen.
    Das ganze soll etwa so aussehen:
    - Ein Plugin kann über eine irgendwie globale Funktion sich selbst zu einer internen Liste aus Plugins hinzuaddieren
    - Alle Plugins sind abgeleitet von der selben virtuellen Klasse "PluginGeneric"
    - Meine Hauptklasse "Archivia" soll die Plugin-Liste der Reihe nach durchgehen und zu jedem die (statische) Funktion bool Plugin->isApplicable(char data);* ausführen.

    Meine Fragen sind folgende:

    1. Kann ich in meiner Hauptklasse eine statische Funktion und Variable definieren, und diese .h Datei dann trotzdem bedenkenlos in shared libs oder static libs includen? Meine Befürchtung ist, dass am Ende die statische Variable zwei mal existiert - einmal in der DLL von meiner HauptLib und einmal in der DLL vom Plugin 😕

    2. Wie kann ich eine AddToPluginList Funktion bauen? Da die Klassen selbst ja nicht instanziert sind kann ich ja nicht einfach AddToPluginList(PluginGeneric*) machen.

    Danke!





  • dot schrieb:

    http://en.wikipedia.org/wiki/Factory_method_pattern 😉

    Danke.
    Aber ich denke, es funktioniert nicht. Bei dem Factory-Dings braucht man offenbar eine Funktion, die alle Plugins kennt (hardcoded). Naja, und das geht bei mir nicht...



  • Ich denke du brauchst irgendeinen Pluginloader der die DLLs läd und eine Initialisierungsfunktion aufruft. Die Plugins können in einem XML stehen oder in einem bestimmten Ordner liegen.



  • Moin,

    habe mich im Zuge meienr Arbeit auch mal damit beschäftigt, es dauert aber noch bis ich es erstmals implementieren werde, ich kann dir aber vorab schonmal folgende Tipps geben.

    Für das Pluginsystem solltest du Interface-Klassen verwenden, von denen deine Plugins abgeleitet werden. Somit kennt der Loader den Typ des Plugins und du musst onehin definieren welche Plugins welche Funktionen erweitern dürfen.
    Am besten gibts du deinem Interface auch eine Methode um eine Instanz zu erzeugen und eine um sie wieder zu zerstören.
    http://stackoverflow.com/questions/431533/c-dynamically-loading-classes-from-dlls

    Eine alternative hierfür wäre, dass du dich der Methodik von Erweiterungsfunktionen bedienst und qausi nur Funktionen aus deinen Plugins lädst. Dazu kannst du z.b. unter Windows mit

    //at startup
    LoadLibrary
    GetProcAddress
    
    //at unload
    FreeLibrary
    

    einen Funktionspointer deiner Erweiterungsmethode erzuegen lassen und diesen dann an entsprechender stelle aufrufen. Du musst natürlich dann die Struktur des Pointers kennen/definieren.


Log in to reply