PDA

View Full Version : [C++] Come funzionano i plugins ?


trallallero
14-10-2008, 12:57
Ho un eseguibile (mumble) che non dovrebbe essere mai modificato.
Ho delle librerie che dovrebbero essere linkate all'eseguibile ma solo una alla volta, un eseguibile per ogni libreria.

Per adesso sò che il plugin dovrà avere almeno 2 parametri, una stringa e l'owner,
Ma se nel futuro avrò bisogno di plugins con più parametri, come posso renderli dinamici ?
Il problema è che non posso chiamare direttamente la libreria ma ho mumble come interfaccia quindi
attualmente la chiamata del plugin, nel main di mumble, è fatta così:

...
#ifdef SUPERCLIENT
Plugin p(qsCfgFileName, app);
#endif
...

qsCfgFileName è una stringa e app è un riferimento alla QApplication di mumble.

la classe Plugin è la seguente:

#ifndef PLUGIN_H_
#define PLUGIN_H_

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

#include TOSTRING(PLUGIN_CLASSFILE)

class Plugin : public PLUGIN_CLASS
{
public:
Plugin(const QString& sCfgFile, QApplication& owner)
: PLUGIN_CLASS(sCfgFile, owner) {}
};


#endif /*PLUGIN_H_*/

In pratica uso delle defines al compilatore: PLUGIN_CLASSFILE, l'header file della classe, e PLUGIN_CLASS, il nome della classe del plugin.

Quindi se voglio usare un plugin di nome Pippo la cui classe è dichiarata nel file Pippo.h, passerò al compilatore

PLUGIN_CLASSFILE=Pippo.h e PLUGIN_CLASS=Pippo

Però son bloccato a questi 2 parametri, nel futuro se voglio aggiungerne dovrò modificare il codice di mumble. C'è un modo per evitare ciò ?

Grazie

cionci
14-10-2008, 16:13
I plugin funzionano solitamente con delle dll linkate a tempo di esecuzione. L'interfaccia delle dll è comune per tutte, per implementare un plugin bisogna implementare le funzioni/classi definite nell'interfaccia della dll con il programma.

trallallero
14-10-2008, 16:29
I plugin funzionano solitamente con delle dll linkate a tempo di esecuzione. L'interfaccia delle dll è comune per tutte, per implementare un plugin bisogna implementare le funzioni/classi definite nell'interfaccia della dll con il programma.

Quindi è corretto quello che ho fatto.

Cioè, se vuoi modificare i parametri al plugin, devi ridefinire l'interfaccia e ricompilare .

Comunque l'unica funzione che hanno in comune è il costruttore perchè tutti i plugins sono classi derivate da QThread, quindi hanno un metodo run() obbligatorio (in QThread è pure virtual).

Questo perchè mumble usa QT e se non usiamo un thread è impossibile lanciare un programma da mumble (è un pò lunga spiegare).

PS: Grazie e ben tornato :)