Wie macht man Plugins?



  • Hallo!
    Ich arbeite gerade an einem Programm, welches ein Menü generiert. Das ganze ist zwar für linux aber spielt bei meiner Frage (glaube ich) keine Rolle. Jedenfalls ist es so aufgebaut:
    Mein Hauptprogramm generiert aus entsprechenden Dateien einen aus Klassen besteneden Datenbaum, der das Menü darstellt.
    Die Plugins sollen jetzt dieses Menü für bestimmte Anwendungen zugänglich machen, dazu wird zB ein Verzeichnisbaum erstellt (Ähnlich dem Startmenü unter Windows). Diese Aufgabe sollen jetzt "Plugins" übernehmen, leider scheint dieser Versuch zu scheitern:
    Ich habe mein "Plugin" als dynamic lib kompiliert und auch sehr erfolgreich im Hauptprogramm geladen, leider kann ich aber nicht vom plugin aus auf den Klassen-Datenbaum zurückgreifen, was aber logischerweiße unbedingt nötig ist... Kann man von einer DL nicht auf die Variablen etc vom Hauptprogramm zurückgreifen?

    Habe ich einen falschen Ansatz gewählt oder kann ich meine Arbeit noch retten?

    THX



  • Übergibst du deinem Plugin auch einen Zeiger auf die Datenstruktur(en) im Hauptprogramm?
    Anders gehts natürlich nicht..



  • Das dachte ich mir schon, dass man die einzeln übergeben muss. Ist das wirklich die einzige Mögichkeit?
    Hier ein Ausschnitt: (Der Zeiger root auf die Klasse GROUP soll übergeben werden)

    typedef void (*plugin)(GROUP *root); //RICHTIG?
    plugin startPlugin = (plugin) dlsym(handle, "init");
    const char  *dlsym_error = dlerror();
    if(dlsym_error)
    {
         cerr << "   " <<  ERROR << dlsym_error << endl;
         dlclose(handle);
         return 0;
    }
    startPlugin(root); //execute Plugin
    

    Der Prototyp des Plugins sieht folgendermaßen aus:

    extern "C" void init(GROUP *root)
    

    Gibt es wirklich keine andere Möglichkeit darauf zuzugreifen? Ich muss den Datenbaum, die Konfigurationdatei-Klasse und eine Hand voll weitere Variablen übergeben!! Gibt es da keinen Trick oder so...

    //EDIT: Ich habe leider noch ein kleines Problem: Die Klasse für das Einlesen der Konfigurationsdatei im Hauptprogramm:

    SCONF config
    

    Wenn ich das so wie es ist übergebe erscheint beim Ausführen immer folgender
    Fehler:

    ./emg: symbol lookup error: /home/sammy/plugins/rox.so: undefined symbol: _ZN5SCONF6getVarESs



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten