Plugin System entwerfen ?



  • hi

    Ich wollte ein Plugin System für mein Programm implementieren damit man mit wenig Aufwand ein Plugin bzw. Modul erstellen kann.

    Hierzu mal mein bisheriger Code des Plugin Systems:

    class CPluginIO
    {
    public:
    	CPluginIO();
    	void classLoader(); // Wie könnte da die Implentierung aussehen ?
    	virtual void initAttribute();
    	virtual void printOnLCD() {};
    
    protected:
    	void addAttribute(std::string, std::string);
    	void setAttribute(std::string, std::string);
    
    private:
           map<std::string,std::string> pluginAttribute;
    };
    
    class PSysInfo : public CPluginIO
    {
    public:
    	PSysInfo();
    	void initAttribute();
    	void printOnLCD() {};
    };
    
    class PScreenSaver : public CPluginIO
    {
    public:
    	PScreenSaver();
    	void initAttribute();
    	void printOnLCD() {};
    };
    

    Ich habe zurzeit eine Basis Klasse die CPluginIO heisst von den dann die Plugins abgeleitet werden.
    Nun will ich beim Programmstart die Methode initAttribute der Klassen aufrufen. Nur kenn ich ja jetzt nicht die Klassennamen um ein neues Objekt zu erzeugen ?
    Wie kann man jetzt beim Programmstart die Plugin Klassen irgendwie "anmelden" bei der Basisklasse um die Methoden aufzurufen ohne was am Hauptprogramm zu verändern ?
    Oder kann mir vielleicht jemand Tipps geben wie man ein Plugin System besser entwirft ?

    MFG
    xmarvel



  • Die Idee ist in Ordnung. Ich würde sagen, dass jedes Plugin eine Funktion exportieren muss, die nach dem Aufruf einen Zeiger oder eine Referenz auf die Basisklasse zurückgibt. Somit hast du ein Objekt mit dem du arbeiten kannst.



  • Was meinst du mit Funktion exportieren wie kann man das machen ? Habe da keinen Ansatz wie ich das Programmiertechnisch lösen könnte ?



  • Eine generische Lösung gibt es nicht - unter Windows kann man dlls verwenden unter Linux so(?).



  • Also Plugin Verzeichnis durchsuchen dann einzelne so bzw. dll laden und zum Schluss Methode aufrufen so wär die Reihenfolge um ein Plugin zu laden richtig oder ?

    Habe mir mal die Mühe gemacht und ein UML Klassendiagram entworfen.

    Gedachter Programmablauf
    Habe mir das so überlegt das beim erzeugen der Plugins die Methode initPluginsName() aufgerufen wird und die Werte mittels insertCategory und insertPluginName die Namen und Kategorie in einem ListBox angezeigt werden (hier QPluginBox) dann soll beim entsprechenden klick auf dem Pluginnamen ein neue Instanz des Plugins erzeugt werden.
    Um dann die Methode printOnLCD des Plugins aufzurufen und die Attribute der Instanz in eine Tabelle anzuzeigen (hier QAttrBox)

    Nur klappt es hinten und vorne nicht. 🙄

    Aufgetauchte Probleme bzw. Fragen
    1. Beim erzugen der Pluginnamen ist schon das Objekt der Klasse QPluginBox erzeugt worden und damit hab ich den Pointer nicht um auf die Methode des Objektes zuzugreifen.
    2. Wenn ich die Namen in der ListBox mal drin habe wie kann ich beim klicken ein neues Objekt erzeugen wenn ich nur den PluginNamen besitze ?
    3. Es werden immer neue Instanzen der Klassen erstellt jedes mit seinen eigenen Attributen (ein Attribute sieht z.B. folgendermasse aus Attribut = "x" Value = "12") wo sollte ich die Attribute am besten abspeichern ? In der Basisklasse so wie jetzt oder lieber in den Pluginklassen ?
    4. Da ich die Plugins eh in Kategorien einteile sollte ich da vielleicht lieber eine Klasse pro Kategorie erstellen und dann enstprechend Methoden für die Plugins ? Oder so wie jetzt für jedes Plugin eine Klasse und dann die in Kategorien einteilen ?
    **
    Schlusswort ;)**
    Im Endeffekt will ich sowas ähnliches bauen wie beim QT Designer bzw. bei Borland C++ Builder wo man z.B. in der Toolleiste ein Label erstellt und dann die Attribute jeweils zum Label in einer Tabelle sieht. Nur das ich die Auswahl der Toolleiste mittels Plugins realisieren will.
    Ich erwarte keine komplette Lösung dafür aber vielleicht könnt ihr mir ja Tipps bzw. Hinweise geben und das Klassendiagramm anschauen und eure Meinung abgeben und sagen was man anders machen könnte.

    MFG
    xmarvel


Anmelden zum Antworten