PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C/C++] Plugins???



7.e.Q
08-05-2006, 07:20
Hi Leute,

ich möchte mein Programm mit der Fähigkeit versehen, PlugIns zu nutzen. Also eine Extension-Engine selbstentwickeln, wenn man so will. Kann mir einer Tipps geben, wo man ansetzen muss, wie man das macht, Informationen, Links, Tutorials, Guides, Dokumentationen?

Wäre super!
Danke


Gruß,
Hendrik

RHBaum
08-05-2006, 10:46
Also auf rein C++ technischer Ebene hab ich da kaum support gefunden, kann aber auch an meiner fehlenden Geduld zur extensive suche liegen.

Einige hoehere C++ Biblotheken bieten nen Plugin mechanismus, support ... die QT zum beispiel.

Nen Mechanismus selber zu bauen iss eigentlich auch gar nicht so schwer ... (wenn er nicht plattformunabhaengig sein muss) und man sich mit DLL's und So's (Shared objects unter Unix) gut auskennt.
DIe anforderungen sind auch sehr individuell meist (Versionierung, Schnittstellenkompatibliaet, ....) so das eine alles umfassende Implementierung wahrscheinlich zu komplex werden wuerde ....

Ciao ...

7.e.Q
08-05-2006, 11:54
Naja, es geht mir nur darum, ein Verzeichnis zu haben, wo ich Dateien reinschmeißen kann, die mir zu meinen schon implementierten Kommandos (in meinem Programm ist ein auf GNU Readline basierender Kommandozeilen-Interpreter hinter einem Telnet-Server drin), zusätzliche Kommandos mit den entsprechenden Funktionen hinzufügen. Ich brauch also für jedes Plugin eine Funktion, die mir den Befehl als String zurückliefert. Und eine Art "Invoke" Funktion mit entsprechend standardisierter Parameter-Übergabe (dazu fällt mir der Begriff "Interface" ein).

Schön wäre es, wenn man dahingehend das Designkonzept Singletons weiterverwenden könnte.




class MySingleton
{
private:
MySingleton();
~MySingleton();

public:
static MySingleton& getInstance()
{
static MySingleton Instance;
return Instance;
}
}




#include "MySingleton.h"

int main(int argc, char** argv)
{
MySingleton* cMySingleton = &MySingleton::getInstance();
}



Sowas in der Art... Nur eben dynamisch während der Laufzeit hereingeladen.

Ich hab was über dlfcn.h, dlopen, dlsym, dlerror... gelesen. Damit soll man zumindest C Funktionen dynamisch zuladen können. Auch mit Klassen soll sowas möglich sein. Wäre super, wenn dazu noch jemand was sagen könnte, vielleicht sogar mit praktischen Erfahrungen aufwartet.

panzi
08-05-2006, 12:29
Hab mal da was proof-of-concept mäßig ausprobiert. Hilft dir eventuell.

RHBaum
08-05-2006, 12:52
Also wir implementieren hier Funktionalitaet mittels Plugins ...

Nur unter windows, also nutzen wir LoadLibrary und GetProcAdress etc ... duerft aber nich den unnerschied machen.

Unsere Plugin's verwenden auch Klassen fuer die Schnittstellen, hat den vorteil das die Schnittstellen logisch gesehen einfacher werden (besser strukturiert), hat aber den nachteil, das die plugins und das framework mit zueinander compatiblen compilern uebersetzt werden muss ...(name mergling, Parameter anordnung .. etc)

Technisch funktioniert das ganze so ....

Die Dll's implementieren eine handvoll statischer funktionen, daraus bekommt der Aufrufer die grobe Information ... ob die Dll ueberhaupt nen compatibles plugin ist, nen grundlegenden Namen fuer das Plugin, ne version fuer die Pluginfactory etc ....

Die Pluginfactory ist die erste Abstrakte Klasse (Interface) die Exportiert wird von der Dll ... die beinhaltet so funktionen countPlugins, getPlugin .... also ne Liste von Plugins ....
Die Plugins (IPlugin) selber ham wiederum nen Typ/Namen (inklusive eincodierter versionsnummer), und eine "cast" funktion ....
Mittels der cast funktion wird das IPlugin erstmalig auf den gewuenschten Typ (IWasweissich) "gecastet". nicht wirklich gecastet, weil eigentlich werden bei den meisten hier die wirklichen Klassen erstmalig erstellt. (Gibt aber auch welche die nur casten ) ... Die Definierten Plugins sind je nach aufwand und verhalten teilweisse multiinstanzfaehig, teilweisse als singelton implementiert ...

Demgegenueber steht auf der anderen seite nen Pluginmanager, dem gibt man nem verzeichniss, da zieht er alle dll's draus an, und checkt ob die ueberhaupt die statischen funktionen implementieren, wenn ja, holt er sich nen IPluginFactory Verweiss, iteriert durch alle impelmentierten IPlugin Implementationen und legt die intern in ner structur ab .... den HInstance waert behaelt er sobald er was ablegt, ansonsten gibt er die dll sofort wieder frei ....

Als Benutzer der Plugins sieht man nur den pluginManager (Singelton) ... den fuettert man mit nem SchnittstellenNamen/Typ (inkl version) den man braucht und der Pluginmanager gibt ne liste mit IPlugin Zeigern zurueck, die er in den Dlls gefunden hat. DIe IPlugin DInger muss man nu noch auf den richtigen Typ "casten" ....

So funktionierts bei uns, iss aber fuer groesseres Projekt also dementsprechend umstaendlich und komplex ^^

Ciao ...

7.e.Q
08-05-2006, 14:26
dementsprechend umstaendlich und komplex ^^


Ich merk das schon. :o

Ich muss mir das noch ein paar mal durchlesen, bis ich das verinnerlicht habe. Eine kleine Plugin-Engine hab ich bei mir jetzt implementiert über die Funktionsbibliothek libltdl. Also dlopen und so... Funktioniert schon ganz gut. Mir fehlt jetzt nur noch die Möglichkeit, ein Plugin im Betrieb austauschen zu können (reload-Funktion). Da bin ich aber dran.