Realisierung von Plugins ???



  • Ich möchte ein Programm mit Plugins realisieren. Ich habe keine Ahnung wie man das macht. Kann mir da jemand helfen? Gibt es da irgendwelche Tutorials, die das kanonisch, unabhängig von irgenwelchen Programmen (Photoshop, Netscape,...) beschreiben?

    Das ganze soll in etwa folgendermaßen realisiert werden:

    Es gibt eine Plugin-klasse plugin.h:

    … ??? …
    class Plugin {
    public :
              Plugin()  { }
      virtual ~Plugin()  { }
      virtual float process( float x )  { }
    };
    … ??? …
    

    Von dieser sollen die eigentlichen Plugins abgeleitet werden, z.B.:

    #include "plugin.h"
    
    class CosinusPlugin : public Plugin {
    public :
      CosinusPlugin()  { }
      ~CosinusPlugin()  { }
      float process( float x )  { return (float)interneMethode( x ); }
    private:
      double interneMethode ( double x )  { return cos( x ); }
    };
    

    Das sind jetzt nur abstrakte Beispiele, es geht hier um das Prinzip.
    Von Host-Seite soll das dann in etwa so aussehen:

    Host.cpp

    #include "plugin.h"
    
    ... ??? ...
    
    Plugin* loadPlugin( char* fileName );	// forward bzw. Deklaration in einer Bibliothek
    
    void main (int argNum, char** arg)
    {
      Plugin* plugin = loadPlugin( arg[1] ) ;	// wie muss das passieren ????
      cout << "plugin.process( 10 ) = " << plugin->process( 10.0 ) << endl;
    }
    

    Was muss an den ???-Stellen noch so stehen, diese mysteriösen extern oder pragma-Anweisungen oder was - und warum? Welche Compiler-Switches brauche ich?
    Das kompilierte Plugin soll dann einfach eine Datei mit einer bestimmten Struktur sein, welche vom Host erkannt und geladen werden kann (im Beispiel über die loadPlugin()-Funktion). Ideal wäre es, wenn die Plugins auch auf verschiedenen Betriebssystemen geladen werden können, ohne dass man sie für jedes Betriebssystem neu kompilieren muss. Die einzige Einschränkung soll der Computertyp sein (also z.B. Festlegung auf 32bit Intel-PCs mit SSE oder so). Ein Plugin-Programmierer soll lediglich die Datei plugin.h benötigen und einen beliebigen C++-Compiler (oder vielleicht sogar einen beliebigen anderen Compiler?), keine sonstigen Extras (irgenwelche Konverter oder so). Ist so etwas möglich?
    Wenn nein, ist es zu mindest auf die beschriebene Art und Weise möglich, lediglich mit der Einschränkung, dass das Plugin mit einem beliebigen C++-Compiler auf den entsprechenden Ziel-Platformen kompiliert wird, ohne Änderungen am Code vornehmen zu müssen.

    Wäre sehr dankbar, wenn mir jemand dabei helfen kann.



  • Du könntest deine Plugins in Dynamischen Libs auslagern (.DLL oder .SO)
    Diese dann beim start laden und nutzen.

    So könntest du auch später noch plugins hinzufügen/verändern



  • und wie mach ich das ??????



  • Dynamische Biblioteken wirklich erst zur Laufzeit Linken und keine Wrapper .libs verwenden, einheitliches Interface und eine Konfigurationsdatei in der du die zu ladenden dynamischen Biblioteken angibst.

    Oft sind Plug-Ins auch in einer Skriptsprache geschrieben, dann brauchst du einen Interpreter, der die entsprechenden Skripte lädt und ihnen den Zugriff auf benötigte Funktionen/Variablen ermöglicht.



  • für dlls unter windows kannst nach LoadLibrary(), GetProcAddress() usw. suchen.

    du musst dann halt die Plugin-Klasse sowohl dem plugin als auch dem programm zur verfügung stellen.

    Die Plugin-Klasse sollte dabei aussließlich virtuelle Methoden haben. ob sie dabei auch =0 (also abstrakt) sein müssen, damit das auch gescheit funktioniert, weiß ich jetzt nicht. habe schon lange nichts mehr in diese richtung gemacht.
    Was du noch beachten solltest, ist die speicherverwaltung. d.h. es kann (muss aber nicht) zu problemen führen, wenn du speicher im programm anforderst und diesen im plugin freigibst. bzw. umgekehrt. (std::string und konsorten gehören ebenfalls in diesen Bereich).
    Das kannst du lösen in dem du noch funktionen von deinem programm aus zur verfügung stellst, die den Speicher verwalten.



  • Was die nutzung von den Plugins über verschiedene Betriebsysteme (Linux, Windows, etc), onhe zu Kompilieren, angeht. Das kannst du vergessen, außer es gibt einen C++ Interpreter, oder dass ich etwas verpasst habe.
    Kannst aber wie darthdespotism sagte eine Skriptsprache verwenden. Natürlich solche die allen Zielplatformen auch vorhanden ist. Mit Java gehts theoretisch auch, aber ist evtl zu umständlich.



  • Ok, danke so weit.
    Zu Windows bin ich mittlerweile auch fündig geworden. Danke für die Tips.
    Aber wie mache ich das unter Linux? Wie erzeuge und vor allem wie lade ich diese .so-files? Sind die wenigstens innerhalb von Linux kompatibel oder unterscheiden die sich wieder von Distribution zu Distribution?
    Könnte man nicht eine Art von Konverter schreiben, der so-files in dll-files umwandelt und umgekehrt, so etwas müsste doch möglich sein? Insbesondere wenn man voraussetzen kann, dass die Dateien eine Bestimmte Struktur haben (eben die eines bestimmten Plugins).



  • guck mal bei Codeproject.com ... da stehen nen haufen Beispiele zu der THematik ...



  • Meine Linux-Fragen sind nocht nicht beantwortet. Auf codeproject.com geht´s leider nur um Windows. Hat jemand nen link oder forum oder irgend etwas.



  • 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.



  • Stichwort man: dlopen

    Wenn ich heute Abend zu Hause bin, kann ich dir mal einen kleinen Code posten, den ich dazu geschrieben habe.



  • hi,

    rüdiger hats schon gesagt: dlopen

    schau mal hier:
    http://www.tldp.org/HOWTO/C++-dlopen/index.html

    cu acron


Anmelden zum Antworten