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 :

Chargement dynamique d'une librairie


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut Chargement dynamique d'une librairie
    Bonjour,

    voilà, j'suis pas trop une pro du C++ et de tout ce qui est implémentation de librairie statique/dynamique...

    Je vous expose la situation...

    J'ai donc une librairie que je dois implémenter : je dispose du .h, du .lib et du .dll.

    J'ai commencé par l'implémenter en statique,
    j'ai donc dans mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "laLibrairie.h"
    #pragma comment (lib, "laLibrairie.lib")
    j'ai aussi ça, je sais pas à quoi ça sert, ni même si ça sert...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BOOL APIENTRY DllMain( HANDLE hModule, 
    				 DWORD  ul_reason_for_call, 
    				 LPVOID lpReserved
    				)
    {
        return TRUE;
    }
    Et après, j'arrive à utiliser les fonctions de la librairie, nickel


    Maintenant, je voudrais charger dynamiquement cette librairie...
    Comment dois-je m'y prendre?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Les points d'entrée sont LoadLibrary(), GetProcAddress() et FreeLibrary()
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Ah oui,
    j'me souviens que j'avais déjà utilisé un truc de ce genre...

    En fait, les GetProcAddress permettent de récupérer des pointeurs sur les fonctions de la librairie
    c'est un peu sioukse quand même...
    y'a pas plus simple

    Ah mais je viens de retrouver le projet dans lequel j'avais utilisé cette méthode...
    J'avais fait ça dans une classe...

    Là, en fait, je suis en train de créer une autre librairie de fonctions (qui utilisent les fonctions fournies par la librairie que j'implémente)

    J'ai un doute sur la façon dont je dois m'y prendre...
    Faut-il que je crée des fonctions 'ChargerLibrairie'/'LibererLibrairie' qui fassent appel à LoadLibrary/FreeLibrary...
    Et puis un GetProcAddress à chaque fois que je veux utiliser une fonction de ladite librairie?...
    car dans mon cas, je ne peux pas trop charger les pointeurs sur les fonctions de la librairie dans les variables globales, non?....

    Pourriez-vous m'aider?
    Merci

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par melleb Voir le message
    En fait, les GetProcAddress permettent de récupérer des pointeurs sur les fonctions de la librairie
    Oui
    Citation Envoyé par melleb Voir le message
    c'est un peu sioukse quand même...
    y'a pas plus simple
    Non, c'est comme cela

    Le LoadLibrary() va "mapper" la DLL dans l'espace mémoire de ton process.
    Le FreeLibrary() va enlever la DLL de l'espace mémoire de ton process.

    Le GetProcAddress() va permettre de récupérer l'adresse de la fonction présente dans ta DLL. En général, cette adresse est stockée dans un pointeur de fonction.

    ATTENTION : ce pointeur de fonction n'est valide qu'entre l'appel à GetProcAddress() et FreeLibrary(). Il est interdit d'appeler FreeLibrary() et ensuite d'utiliser le pointeur de fonction que tu as récupéré par GetProceAddress() sinon, c'est le crash assuré.

    En général, la séquencement des appels est le suivant :
    • LoadLibrary() en début de programme
    • GetProcAddress() pour chacune des fonctions de la DLL que tu vas utiliser et stockage de ces adresses dans des pointeurs de fonction. Cela peut être des variables gloables, ou encore de variables membres de classe ou ce que tu veux encore.
    • Utilisation des pointeur, déroulement de ton programme
    • Déchargement de la DLL avec FreeLibrary() en fin de programme
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    En général, la séquencement des appels est le suivant :
    • LoadLibrary() en début de programme
    • GetProcAddress() pour chacune des fonctions de la DLL que tu vas utiliser et stockage de ces adresses dans des pointeurs de fonction. Cela peut être des variables gloables, ou encore de variables membres de classe ou ce que tu veux encore.
    • Utilisation des pointeur, déroulement de ton programme
    • Déchargement de la DLL avec FreeLibrary() en fin de programme
    Ok,

    donc, comme je n'ai pas de classe
    je peux faire des variables globales pour stocker les pointeurs de fonctions dans ma librairie que je crée et qui encapsule la 1ère??
    et je fais des fonctions qui charge et décharge la 1ère librairie que j'appellerai en début et fin de programme??

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui, tu peux même encapsuler ça dans une classe.
    Ta classe aura :
    - tes pointeurs de fonction comme membre
    - une méthode init qui fera le LoadLibrary et tous les GetProcAdress
    - une méthode pour chaque fonction de la librairie que tu veux appeler.
    - une méthode qui décharge la librairie : elle fait le loadlibrary, et met les pointeurs de fonction à zéro pour que ce soit clean.

    Tu fais ça une fois pour toutes et comme ça tu n'as plus à manipuler les pointeurs de fonction à chaque fois.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    yep,
    c'est sûrement le plus simple

Discussions similaires

  1. Chargement dynamique d'une archive.jar
    Par cfrayer dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2006, 17h00
  2. [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, 22h37
  3. Réponses: 2
    Dernier message: 25/10/2005, 19h03
  4. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 12h46
  5. Réponses: 19
    Dernier message: 26/04/2004, 09h54

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