Plugin System, DLL's laden



  • Hallo,

    vielleicht kann mir hier jemand helfen. Ich möchte eine Applikation erstellen die mehrere Kommunikations DLL's (mit unterschiedlicher API) nutzt.
    Dabei soll die Applikation möglichst einfach mit neuen Kommunikations-DLL's(die auch wieder eine andere API haben können) erweitert werden.
    Wie geht man am besten an so eine Sache ran?
    Wie könnte man diese DLL's in einem PluginSystem verpacken?

    givemeaname



  • Hallo

    Es gibt ein Design Pattern für Plugins. Dazu findest du im Forum sicher auch schon weitere Threads.

    bis bald
    akari



  • givemeaname schrieb:

    Ich möchte eine Applikation erstellen die mehrere Kommunikations DLL's (mit unterschiedlicher API) nutzt.
    Dabei soll die Applikation möglichst einfach mit neuen Kommunikations-DLL's(die auch wieder eine andere API haben können) erweitert werden.

    Was verstehst du unter DLLs die unterschiedliche APIs haben können? Irgendwie macht das so keinen Sinn.



  • @givemeaname: Wenn dir nicht klar ist dass es eine Grundvoraussetzung für die Verwendung von Plugins ist, eben eine gemeinsame, immer gleiche API für die Plugins zu haben, dann hast du ein Verständnisproblem, und solltest dieses erstmal beheben.

    Falls du meinen solltest dass du verschiedene APIs wie z.B. für Sockets, Named Pipes, Serielle Schnittstellen etc. so kapseln möchtest dass sie für das Programm gleich zu bedienen sind, und für jede dieser unterschiedlichen APIs dann ein "Wrapper-Plugin" schreiben willst ... dann hast du die Lösung ja schon.

    Plugins macht man mit Windows DLLs (und C++) IMO am einfachsten imdem man genau eine Funktion mit fixem Namen exportiert, und diese ein neues "Plugin" Objekt zurückgeben lässt (oder auch einen Zeiger auf ein Singleton welches ein bestimmtes Interface implementiert).

    z.B. so:

    // plugin_interface.hpp:
    class foo;
    class bar;
    class plugin_interface
    {
    public:
        virtual foo* create_foo() = 0;
        virtual bar* create_bar(char const* name) = 0;
    };
    
    // plugin_a.cpp:
    class plugin_a : public plugin_interface
    {
    // ...
    };
    
    static plugin_a s_the_plugin;
    
    // die "eine Funktion mit fixem Namen":
    extern "C" __declspec(dllexport) plugin_interface* get_plugin_interface()
    {
        return &s_the_plugin;
    }
    


  • vielen Dank für eure Antworten!

    @ hustbaer: Ja mir ist klar dass Plugins die gleiche API haben sollten, war vielleicht etwas blöd beschrieben. Was du unter 'Wrapper-Plugin' beschrieben hast, ist genau dass was ich meine. Ich möchte verschiedene Kommunikationsschnittstellen ansprechen (zB.:RS232 RS485 usw...). Dazu stehen mir von diversen Anbietern DLL's zur Verfügung. Leider sind die von der Architektur her nicht einheitlich. Nun wollte ich gern wissen obs noch einen besseren Weg gibt, als jede DLL in ein Plugin zu verpacken.

    Im Prinzip ist die "Wrapper-Plugin" Lösung nicht schlecht. Aber was kann ich machen wenn ich zB.: schnittstellenspezifische Funktionen/Parameter aufrufen möchte?
    Ich bräuchte dann eine Art dynamisches Plugininterface.



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • @givemeaname: dann kannst du dynamic_cast verwenden um zur konkreten Klasse runterzucasten, und diese spezifischen Funktionen einfach ganz normal aufrufen.

    Und du *musst* ja auch keine Plugins machen, das hier beschriebene Muster lässt sich ja auch ohne DLLs gut anwenden (=einfach alle Wrapper mit ins Programm reincompilieren).



  • Naja ein PluginSystem wär nicht schlecht, damit man das Hauptprogramm nicht neu compilieren muss. Ich bräuchte ein dynamisches Interface dessen Funktionen/Klassen zur Laufzeit bestimmt werden können.
    dynamic_cast würde ja auch nur zur Compile-Zeit gehen oder gibts da noch eine andere Möglichkeit?



  • givemeaname schrieb:

    dynamic_cast würde ja auch nur zur Compile-Zeit gehen oder gibts da noch eine andere Möglichkeit?

    Wikipedia: Polymorphie (Programmierung)



  • givemeaname schrieb:

    Naja ein PluginSystem wär nicht schlecht, damit man das Hauptprogramm nicht neu compilieren muss. Ich bräuchte ein dynamisches Interface dessen Funktionen/Klassen zur Laufzeit bestimmt werden können.
    dynamic_cast würde ja auch nur zur Compile-Zeit gehen oder gibts da noch eine andere Möglichkeit?

    Wie/wo/was dynamisch? Willst du denn diese "nicht immer gleichen" Funktionen skripten?

    Wenn du sowas willst kannst du evtl. COM und IDispatch verwenden - zumindest bevor du dir selbst ein ähnliches System strickst.

    Aber... kannst du vielleicht ein Beispiel geben was dieses "dynamisches Interface dessen Funktionen/Klassen zur Laufzeit bestimmt werden können" können müsste? Also einen Vorgang schildern was da passieren müsste/würde/könnte.



  • Also ich hab mal etwas nachgedacht. Vielleicht würde ein statisches Plugin-Interface ausreichen.

    Die Idee das ganze zu scripten ist mir auch schon eingefallen, weis aber nicht obs von der Geschwindigkeit her ausreicht.
    Mit COM hab ich bisher überhaupt keine Erfahrung, kann also schlecht abschätzen wie komplex die ganze Sache wird.

    Mal noch eine anderes Plugin Problem: Wie kann ein Plugin auf Funktionen der Hauptapplikation zugreifen? Also zB.: ich schreibe ein Visualisierungplugin. Wie komm ich dann von dem Plugin an die Daten des Hauptprogramms?



  • nennt sich pointer 😮


Anmelden zum Antworten