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 �clair�
    Inscrit en
    Septembre 2003
    Messages
    222
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    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).

  2. #2
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 �clair�
    Inscrit en
    Septembre 2003
    Messages
    222
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    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 ???

  4. #4
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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).

  6. #6
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

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

  7. #7
    Membre �clair�
    Inscrit en
    Septembre 2003
    Messages
    222
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    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

  8. #8
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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

  9. #9
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 �clair�
    Inscrit en
    Septembre 2003
    Messages
    222
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    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 !

  11. #11
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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