IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Exécuter en dynamique des fonctions d'une librairie ?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut Exécuter en dynamique des fonctions d'une librairie ?
    Bonjour,
    J'aimerai savoir comment exécuter en dynamique des fonctions contenues dans une librairie spécifique ??
    Bon ok, la question est incompréhensible donc je vais l'illustrer avec un exemple:

    Je veux donc une application qui au démarage chargerait une librairie (ou plusieurs) et qui me ferait correspondre un bouton pour chaque fonction...
    Par exemple: J'ai une librairie qui contiendrait la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void alarme() {
    Beep(100,100);
    }
    Je veux pouvoir utiliser cette fonction par le biais de mon application.
    (Par exemple, mon application crée un bouton alarme et lorsque jeclique sur le bouton, l'application execute la fonction alarme de ma librairie ?)

    Voilà en gros pouvoir utiliser différentes fonctions dynamiquement !

    J'ai pensé à utiliser un fichier XML par exemple qui contiendrait les diverses informations de la librairie
    Par exemple dans mon cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    <fonction>
    <name>alarme</alarme>
    <parametres>null</parametres>
    <return>void</void>
    </fonction>
    Enfin ce n'est qu'un exemple pour avoir les infos des fonctions, mais ca ne corrige pas le problème pour l'execution de la fonction....

    J'attends vos suggestions avec impaciente.
    Merci d'avance de me répondre.

    PS:C'est une problématique difficile je pense... alors j'espère que vous l'avez compris (Mes explications ne sont pas forcément très claires).
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Ca dépend de l'OS, mais le principe général c'est d'obtenir l'adresse d'un symbole à partir de son nom.
    Sous Windows, c'est LoadLibrary puis autant de GetProcAddress qu'il le faut. Et FreeLibrary une fois terminé.
    Si tu es en C++, ta fonction "alarme" ce sera pas exportée sous ce nom, mais sous un nom complexe encodé. On appelle ça le name mangling, et justement ça a un peu pour but celui de ton fichier xml : décrire les paramètres attendus, la convention d'appel, le namespace, etc...
    Sauf que c'est spécifique à chaque compilo.
    Il est possible d'exporter ta fonction "à la C", c'est à dire juste avec son nom.

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Oui je connais le principe, mais je veux un code commum quelque soit la librairie que je veux utiliser

    Par exemple:
    Un jour j'utilise la librairie avec la fonction alarme
    Et puis un autre jour j'utilise une autre librairie avec une fonction helloWord !

    Le code de mon application doit rester le même, je ne suis pas nom plus supposé savoir le nombre de fonctions contenues dans la librairie !

    Euh... et sous Unix ???
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Sous Windows, il n'y a pas de moyen simple pour récupérer la liste des symboles exportés par une dll.
    Sous UNIX, je connais mal, je sais juste que l'équivalent c'est dlopen / dlsym / dlclose.
    Pour un code "automatique", c'est super balaise. Faut récupérer les symboles (ça, ça va), détecter avec quoi ça a été compilé (alors là déjà). Si c'est du C, ben c'est fini, tu sais pas comment appeler. Faut laisser l'utilisateur spécifier, un peu comme RunDll32.
    Si c'est du C++, faut détecter le compilo et en déduire le name mangling. Faut décoder le name mangling et ensuite tu connais les arguments attendus, pour les fonctions non virtuelles, car elles, tu ne connais pas leur nom, ni même leur nombre (elles sont exportées sous forme d'une vtable = un tableau de pointeur de fonctions).
    Reste ensuite à générer le code assembleur qui faut (en fonction des arguments, de la convention d'appel etc...) et voilà. Je ne parle pas des exceptions levées, de l'instanciation de classes comme argument, etc...
    Si c'est une dll Delphi ou autre, ...

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par MonsieurAk
    Oui je connais le principe, mais je veux un code commum quelque soit la librairie que je veux utiliser
    soit tu forces la libraire a exporter des noms non decorer, soit tu mets le nom decore dans ton fichier de description, soit tu reimplementes (ou re-utilises, je suis a peut pres certain que gcc installe une librairie qui permet au moins de demangler, peut-etre aussi de mangler) l'algo de decoration de nom.

    Euh... et sous Unix ???
    C'est present. Le nom le plus commun est dlopen mais il me semble qu'il y a des Unix qui utilisent un autre nom (peut-etre meme que dlopen est le nom utilise pas Posix, j'ai pas le temps d'aller verifier).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Sous Windows y'a UnDecorateSymbolName, mais c'est pour les compilos MS.

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    soit tu forces la libraire a exporter des noms non decorer, soit tu mets le nom decore dans ton fichier de description, soit tu reimplementes (ou re-utilises, je suis a peut pres certain que gcc installe une librairie qui permet au moins de demangler, peut-etre aussi de mangler) l'algo de decoration de nom.
    J'ai pas tout saisi
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par MonsieurAk
    J'ai pas tout saisi
    D'apres ce que j'ai compris, tu veux pouvoir appeler des fonctions dans une
    bibliotheque chargee dynamiquement, la fonction a appeler etant determinee
    par un fichier XML.

    Les S.E. fournissent generalement -- pour les details, voir la doc des
    S.E. -- des fonctions pour charger une bibliotheque dynamique et y chercher
    des symboles.

    Le probleme si on cherche a appeler des fonctions ecrites en C++, c'est que
    les noms a passer a ces fonctions sont les noms decores (cad avec la
    signature encodee dans le nom ce qui permet de faire de la surcharge).
    Je vois deux solutions a ce probleme
    1. demander a ce qu'on utilise le nom decore dans le fichier XML, soit que
      l'utilisateur le retouve par le moyen qu'il veut, soit qu'il utilise un
      bloc extern "C" pour que le nom decore soit beaucoup plus facile a
      retrouver (parfois les noms C sont decores avec un _ initial)
    2. puisque tu as l'air de vouloir mettre les informations de signature dans
      le fichier XML, utiliser ces informations pour rebatir le nom decore
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Pour bien comprendre, voici comment est réellement exportée la fonction "void alarme()" avec VC++ :
    et avec devcpp / MingW:

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Je pense que la solution la plus simple est d'avoir les noms, leurs paramètres, etc... dans un fichier xml et de le parser ? Non ?

    Je n'aurais donc pas à m'occuper des "décorations"

    En effet, si à chaque librairie, j'associe un fichier xml comportant toutes les infos neccessaire, le problème est réglé !
    (En plus je peux donc empécher l'acces à certaines fonctions, celle qui ne seront pas décrites dans le fichier xml)

    Maintenant, si je ne veux pas utiliser de fichier xml;
    J'ai bien compris le système de décoration de noms, mais je ne sais même pas comment obtenir ces noms décorés à partir de mon appli.

    Par exemple comment obtenir la liste des fonctions (noms décorés) de ma librairie ? Et puis une fois les noms décorés, ils nous faut les paramètres.... Je vais étudier le sujet mais cela me semble bien plus compliqué que si j'utilise un fichier xml.

    PS: Les Dll contiendront simplement diverses fonctions (le c peut largement suffire).

    En tout cas Merci pour ces bonnes informations !
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Tu devrais plutôt regarde du côté des langages de script (Python, TCL...) et de la possibilité de créer des wrappers de bibliothèques C++ (swig). Tu auras beaucoup moins de travail à réaliser.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D5] Créer dynamiquement des variables dans une fonction
    Par MelkInarian dans le forum Delphi
    Réponses: 11
    Dernier message: 14/04/2007, 12h16
  2. utiliser des fonctions d'une librairie C++ en C
    Par vivien313131 dans le forum C
    Réponses: 2
    Dernier message: 30/11/2006, 09h56
  3. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Réponses: 14
    Dernier message: 15/01/2004, 01h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo