[C] Système de plugins "simpliste" - Version imprimable +- N-PN White-Hat Project (https://n-pn.fr/forum) +-- Forum : Programmation (https://n-pn.fr/forum/forumdisplay.php?fid=72) +--- Forum : Langages compilés (https://n-pn.fr/forum/forumdisplay.php?fid=25) +--- Sujet : [C] Système de plugins "simpliste" (/showthread.php?tid=2152) |
[C] Système de plugins "simpliste" - supersnail - 30-08-2012 Bonjour, Je partage ici une petit système de "plugins" que j'ai développé en bidouillant un peu avec le C. Cependant avant de balancer directement le code, quelques petites explications s'imposent. I - Fonctionnement général Le plugin est ici une bibliothèque "liée dynamiquement", c'est-à-dire une DLL sous Windows, ou un .so sous GNU/Linux, qui sera chargée dynamiquement par le programme (via les fonctions LoadLibrary/GetProcAddress sous Windows, ou dlopen/dlsym sous GNU/Linux). Ce programme appelle ensuite la fonction plugin_init, qui prend pour argument une structure nommée plugin_interface. Cette structure est comparable à une interface C++, c'est-à-dire des pointeurs vers des fonctions. Pour mon programme de test, ma structure ressemble à ceci: Code : typedef struct _plugin_int { Maintenant, pourquoi tout ce bazar fonctionne ? La réponse est relativement simple. En réalité, le plugin est chargé dans l'espace mémoire du processus, ainsi il peut accéder à la mémoire de celui-ci (et par le fait, manipuler ses données). Le code (machine) résidant lui aussi en mémoire, notre plugin y a aussi accès, et il peut ainsi exécuter les fonctions de notre programme hôte (qui sera traduit en assembleur par un "call eax", eax contenant l'adresse de la fonction à appeler). II - Le code Le fichier "def.h" (à inclure dans chacun des plugins) Code : #ifndef _DEF_H Le code du programme (program.c) Code : #include <stdio.h> Le code du plugin de test (wtf.c) Code : #include "def.h" Le Makefile Code : all: program.o wtf.o Edit: le code fonctionne juste pour GNU/Linux, pour les windowsiens, renseignez-vous sur les fonctions "LoadLibrary" et "GetProcAddress" (la MSDN est votre amie) RE: [C] Système de plugins "simpliste" - ark - 30-08-2012 C'est très intéressant tout ça, le fonctionnement est facile a mettre en place, c'est pas mal. Par contre le "void main()" c'est crade... RE: [C] Système de plugins "simpliste" - supersnail - 30-08-2012 Je sais, mais c'est juste un PoC que j'ai pondu là :p (le code "en l'état" est dégueulasse et j'en assume l'entière responsabilité ^^) RE: [C] Système de plugins "simpliste" - ark - 30-08-2012 s'pece de sale porc! :p Bon, faut vraiment que je code un truc intéressant a poster moi x] RE: [C] Système de plugins "simpliste" - b0fh - 30-08-2012 Il manque un mécanisme pour permettre au programme principal d'appeler des fonctions du plugin (ce qui est peut-être plus fréquent que l'inverse.) On pourrait répéter les dlopen() pour obtenir plusieurs symboles, mais autant ajouter un 2e struct pour les appels dans l'autre sens ! RE: [C] Système de plugins "simpliste" - supersnail - 30-08-2012 En effet, mais comme je l'ai dit, c'est plus un bout de code expérimental qu'un gestionnaire de plugin fiable Enfin, on peut laisser des fonctions dans l'API qui permet d'enregistrer des "hooks" si besoin (ce qui évite de devoir concevoir une deuxième structure de données), que le programme principal appellera |