Hai letto le doc? li e' spiegato tutto bene bene, vabe... non proprio tutto
PREMETTO:
Il sistema che ho imparato io e' in C, non C++, va quindi compilato con GCC. Per esperienza personale ti assicuro che compilando in G++ da molti problemi (che non ho mai risolto), quindi compila sempre i plugin con GCC (probabilmente il main puo' andare anche con G++)
Inoltre, io ho studiato plugin specifii per le chat, non ho mai pensato di farne qualcuno per un programma tipo questo, pero' suppongo che i concetti siano validi anche per questo.
Comunque:
i plugin sono qualcosa di simile alle shared object, ma non esattamente uguali.
praticamente il plugin viene compilato da gcc con l'opzione -shared, questo consente di poterlo condividere e di renderlo indipendente.
In sostanza:
il sistema basilare che consente di gestire i plugin e' formato da un corpo principale main, dai plugin e da un'interfaccia che il programmatore fornisce ai plugin per lavorare.
Il main, che come l'ho studiato io usa le librerie dlcfn.h, non deve fare altro che aprire i plugin, gestire eventuali errori, verificare se hanno l'entry point stabilito e infine tenere una "tabella" dei plugin caricati.
L'interfaccia, e' in genere una serie di funzioni, elencate in un file .h che viene utilizzato dai plugin. Queste funzioni di interfaccia, sono delle funzioni "generalizzate" che permettono di controllare il tuo programma e di interfacciare il programma con il plugin.
Nel caso di una chat, queste funzioni servranno per:
- Leggere il testo scritto dagli altri utenti
- Scrivere il testo verso gli altri utenti
- Associare il plugin ad un comando (ad esempio il comando /saluta_tutti)
e magari altre cose, ma queste sono basilari
Queste funzioni di interfaccia, DEVONO utilizzare le callback, per poter fare quello che vuole l'utente.
Il plugin invece si presenta come un programma normale, che ha un'entry point fisso (ad esempio la funzione plugin_main) e utilizza le funzioni di interfaccia per dire al main che cosa da il plugin.
Il main, quando darica un plugin, vede se c'e' l'entry point, se c'e' lo esegue. In questo entry poin succedono determinate cose:
- al plugin viene assegnato un identificatore
- l'esecuzione delle funzioni di interfaccia, fa in modo che quello che deve fare il plugin venga registrato nella tabella del main.
So che non ci si capisce molto per ora, ma adesso faccio un esempio (ovviamente inventato e non funzionante
IL MAIN
Code: Select all
#include <dlfcn.h>
#include <stdio.h>
int main()
{
caricamento_del_plugin();
/*questa funzione chiede all'utente il come del plugin da caricare, e lo apre con le librerie dlfcn (e' un po lunga la cosa: guarda sui link che ho messo) in caso di errore, la funzione termina il programma con un msg di errore*/
verifica_entry_point("plugin_main");
/* anche qui un riassunto: si utilizza la funzione getsimbol (o simili) delle dlfcn per ferificare se c'e' l'entry point. In caso non ci fosse, questa funzione esce con un msg di errore*/
esegui_entry_point(ID_Plugin); /* guarda link :)*/
.. resto del programma (eventualmente si registra il plugin nella tabella, che devi inventarti tu, ma questo esempio usa un solo plugin...
}
PLUGIN
Code: Select all
plug_handler *ph;
void funzione_saluta_tutti()
{
// le funzioni plug_iface sono le funzioni di interfaccia fatte da te
plug_iface_message("CIAO A TUTTI")
}
void funzione_away()
{
plu_iface_set_me_away();
}
void plugin_main(plug_handler *Plug, )
{
ph = Plug; /* Plug viene passato dal main all'entry poin con valore ID_Plugin... in fondo, questa e' una funzione :)*/
plug_iface_associa_comando("/saluta_tutti", funzione_saluta_tutti);
/* associo la funzione al comando /saluta_tutti*/
plug_iface_associa_comando("/sono_away", funzione_away);
return 0; // successo
}
spero si sia capito un po
se ci sono probl, scrivi
ciao