2011-10-10 3 views
0

Je crée un éditeur de texte multiplateforme en C++. Je voudrais avoir une base très basique, puis implémenter toutes les fonctionnalités à travers des plug-ins. Mais, malheureusement, je n'arrive à rien dans la conception du système de plug-in. Comment cela se fait-il normalement? Quelqu'un peut me diriger dans la bonne direction? Je ne sais pas si c'est important, mais j'utilise le kit de widgets wxWidgets.Système de plugin pour éditeur de texte écrit en C++

+0

double possible de [ce qui est sûr pour un système de plug-in C++?] (http: // Stacko verflow.com/questions/43322/whats-safe-for-a-c-plug-in-system) – Mat

+0

Avez-vous trouvé ma réponse correcte? prendre soin de l'accepter? – duncan

Répondre

3

Vous pouvez commencer par avoir une classe de base définissant une interface de plugin spécifique, à savoir: TextTransformPlugin, avec une méthode prenant une chaîne et renvoyant une chaîne (virtuelle).

Chaque plugin hériterait de cette interface et vous construiriez cette classe par exemple: SpanishTranslateTransformPlugin dans une bibliothèque dynamique (fichier .so). Dans le programme, vous utilisez dlopen pour ouvrir la bibliothèque (voir here pour un exemple C++). Comme vous ne pouvez pas appeler la classe constuctor, dans la bibliothèque so, vous définissez une fonction standard (même nom pour tous les plugins, disons create() et lui donnons des conventions d'appel C pour que vous puissiez utiliser dlsym pour obtenir le symbole et lancer à une fonction renvoyant un TextTransformPlugin et l'appeler.

extern "C" { 
    TextTransformPlugin * create(); // this would return new SpanishTranslateTransformPlugin 
} 

de cette façon, vous obtiendrez un objet TextTransformPlugin qui est le plug-in. Comme les méthodes d'interface sont virtuelles, les méthodes concrètes seront appelés.

vous devra prendre soin du cycle de vie du plugin, en les gardant dans un registre, sachant quand les utiliser, et finalement les détruire et fermer les bibliothèques

Notez que Windows n'a pas dlfcn.h où vous trouvez dlopen. Il existe des fonctionnalités similaires dans l'API LoadLibrary, mais vous devez extraire les plates-formes vous-même.

Si vous utilisez un framework multiplateforme comme Qt, vous obtenez gratuitement une grande partie de la plate-forme et cela fonctionne sur toutes les plates-formes supportées. Voici un exemple d'application de peinture connectable:

http://doc.qt.nokia.com/latest/tools-plugandpaint.html

Comme vous l'avez mentionné que vous utilisez wxWidgets, cela devrait être la fonctionnalité équivalente prise en charge des plates-formes multiples:

http://docs.wxwidgets.org/2.8/wx_wxdynamiclibrary.html et un exemple complet: http://wiki.wxwidgets.org/Programs_That_Support_Plugins

0

Here est un meilleur fil que vous trouverez sur Internet

Questions connexes