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 :

[débutant]chargement dynamique d'une bibliothèque


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut [débutant]chargement dynamique d'une bibliothèque
    bonjour,
    j'ai besoin d'accéder aux fonctions d'une librairie codée en C. Je voudrais pouvoir entrer dans mon code le nom de la librairie correspondante et le nom de la fonction, charger cette librairie et lancer cette fonction.
    aparemment c'est possible mais je n'arrive pas à trouver copmment.

    merci de votre aide

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <talibrairie.h>
    Ensuite tu peut utiliser n'importe quelle fonction de ta librairie...

  3. #3
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Il faut également, lors de la compilation, faire le lien avec ta librairie. Exemple avec GCC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o fichier fichier.c -lTa_Lib
    Nas'

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    non je me suis peut-être mal exprimé:

    dans mon code, je récupère une chaine de caractere qui correspond au nom de la librairie et une autre qui correspond au nom de la fonction que je veux lancer.

    et je voudrais ouvrir, dans le main la librairie car je connais son nom uniquement par l'utilisateur qui le fournit en parametre, et ensuite, lancer la fonction dont je connais le nom seulement à l'intérieur du main, idem, fourni en paramètre du main.

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Arf!

    Ok, ben ... euh... ca je sais pas alors...

    Mais par contre je suis bien intéressé de savoir comment on fait... J'ai jamais entendu parler de chargement dynamique de bibliothèque en C ....

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    sous unix ou sous windows ?
    un utilisateur te donnerai ces indiquations ? c'est quoi ton prog ?
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2004
    Messages : 124
    Points : 95
    Points
    95
    Par défaut
    Oula ca me paraît chaud tout çà ...
    Je sais pas si le #include est transmissible ds le main (jamais vu !)
    Je vois pas trop comment faire...
    C'est l'utilisateur qui tape le nom de librairie et de fonction ?
    Bonne chance ++
    Mieux vaut rien dire que de se taire !

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Quelle plateforme ?

    sous unix il y a dlopen pour acceder à la lib
    sous Windows il y a LoadLibrary

    ces fonction chargent la lib et renvoient un handle

    ensuite ce handle peut etre utilise par dlsym (unix) ou getProcAdress pour recuperer un pointeur sur une fonction ou sur une variable globale...

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    apparemment, j'ai vu qu'il y a la bibliothèque dlfct.h. si je fais un man dlopen ou man dlsym sous unix, ça correspond à ça. Mais si quelqu'un peux m'expliquer comment ça marche ce serait cool.

    mais je sais que c'est possible.

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    dlfct.h est un entete pas une bibliotheque.

    dlopen charge une shared library (.so/.sl) dont tu lui indique le chemin en arguement, si ce chemin est un chemin absolu ou relatif pas de prob, si c'est seulement un nom de fichier la lib sera recherchée dans les repertoires designées dans la veriable d'env LD_LIBRARY_PATH/SHLIB_PATH

    le flag qui suit indique comment tu soiuhaites que les liens soit resolus : RTLD_NOW est la forme la plus simple les liens sont resolu dès que la lib est chargée... RTLD_LAZY reserve quelquesfois des surprises je le deconseille a moins que tu ne sache vraiment ce que tu fais....

    ensuite tu utilises la valeur de retour de dlopen dans dlsym (premier argument) et tu lui donne une chaine de caracteres : le nom de ta fonction :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int (*entryPoint)(void);
    void *libHandle = dlopen("libmine.so",RTLD_NOW);
    if (libHandle)
    {
       entryPoint = dlsym(libHandle,"MyEntryPoint");
        return entryPoint(); /* appel de MyEntryPoint dans libmine.so */
    }
    par contre quel UNIX utilises tu ?

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    merci!

    je suis sur du HP-UX. Mais dlopen fonctionne sur de l'unix classique?

    et sous Windows il faut une autre bibliothèque j'imagine?

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par fredericL
    merci!

    je suis sur du HP-UX. Mais dlopen fonctionne sur de l'unix classique?

    et sous Windows il faut une autre bibliothèque j'imagine?
    STOP !!!!

    ce que je viens de dire n'est pas valable pour HP-UX !

    Quelle version de HP-UX ?
    si verion 11.0 quelle version 11.0 ?

    Ton prog est-il 32 ou 64 bits ?

    est-ce HP-UX pour PA-RISC ou HP-UX pour itanium ?

    Globalement en 32bits PA-RISC, il faut utiliser
    shl_load et shl_findsym sauf en 11.0B où dlopen est disponible, mais attention si le prog doit tourner sur un systeme anterieur.

    l'extention des lib en HP-UX PA-RISC(32/64) est sl au lieu de so

    et la variable d'environnement est SHLIB_PATH en PA-RISC 32 bits

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    c'est HP-UX PA-RISC 8600
    version 10, 10.20 et 11.00 (plusieurs serveurs)
    64 bits

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par fredericL
    c'est HP-UX PA-RISC 8600
    version 10, 10.20 et 11.00 (plusieurs serveurs)
    Donc mieux vaut utiliser shl plutot que dl en 32 bits....
    de toute maniere en 10 il n'y a pas de 64 bits, non ?

    Je ne suis pas sur que la variable d'environnement soit dispo en 10, elle ne l'est pas en 9 en tout cas...

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    ça je sais pas. Mais shl c'est quoi? :

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    en 64 bits ?

    la variable d'environnement est alors LD_LIBRARY_PATH, je pense que dlopen est dispo normalement ( a voir pour les version antérieures à 11.0) par contre l'extention des lib reste .sl ...

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par fredericL
    ça je sais pas. Mais shl c'est quoi? :
    la famille shl : shl_load, shl_findsym etc.

    c'est plutot plus riche que la famille dl (dlopen/dlsym) mais aussi plus compliqué à utilisé du pur HP quoi !

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    ok merci. je vais essayer.

    sous windows, j'ai trouvé ça est-ce que c'est correct?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    main(){
      HMODULE hDLL = LoadLibrary("TestDLL.dll");
      typedef int (WINAPI *DLL_Function_TestFunction) (int _Value);
      DLL_Function_TestFunction pfn_TestFunction;
      pfn_TestFunction = (DLL_Function_TestFunction)GetProcAddress(hDLL,"TestFunction");
      int Result = pfn_TestFunction(12345);
      FreeLibrary(hDLL);
    }

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Oui, mais !

    le principe est le meme c'est simplement le nom des fction qui changent...

    méfie toi qaund meme de verifier les handle, il est possible que la Dll ne soit pas chargé :
    parce que elle n'est pas trouvée, pas compatible, etc...

    sous Win quand tu mets un nom de DLL tout cours comme tu le fait il faut quelle soit dans le PATH oiu alors dans le meme repertoire que l'application.

  20. #20
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    merci pour votre aide à tous. J'ai essayé et j'ai réussi à faire ce que je voulais.

    merci encore.

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

Discussions similaires

  1. Chargement dynamique d'une bibliothèque (.jar)
    Par Franquie dans le forum Android
    Réponses: 0
    Dernier message: 06/08/2014, 19h11
  2. [débutant] Filtre 'dynamique' sur une JTable
    Par d_token dans le forum Composants
    Réponses: 8
    Dernier message: 04/08/2006, 12h01
  3. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  4. Réponses: 2
    Dernier message: 25/10/2005, 18h03
  5. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 11h46

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