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

Bibliothèques C++ Discussion :

Probleme pour charger une DLL


Sujet :

Bibliothèques C++

  1. #21
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il y a des cas où l'on ne veut pas utiliser le .lib d'importation, en particulier si on veut un véritable dynamisme (les DLL ne sont pas encore connues au moment où l'on compile le programme, un système de plug-in par exemple).

    La méthode classique dans ce cas est d'avoir dans la DLL une classe qui dérive d'une interface (connue elle du programme principal), ainsi qu'une fonction à la mode C, qui retourne un pointeur sur cette interface. Il n'y aura que par rapport à cette fonction au nom non décoré que l'on devra faire un GetProcAddress, et on pourra par la suite utiliser la classe sans problème par l'intermédiaire de son interface, et sans le moindre .lib.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #22
    Invité
    Invité(e)
    Par défaut
    Si le message s'affiche, c'est qu'il y a un probleme lors de la recuperation du pointeur, mais ca signifie quoi? Que le prototype de ma fonction est erroné?

    Apparement, la DLL est chargée correctement, mais ca ne passe pas l'etape de la recuperation du pointeur.
    Non, si le prototype est erroné, ça fera un carnage quand t'appelleras la fonction mais ça ne doit pas t'empêcher de récupérer le pointeur.
    Comme raisons de non récupération du pointeur, je vois (liste non exhaustive)
    - le nom n'est pas bon
    - la fonction ReadInt n'a pas été exportée correctement par la dll (elle n'est pas dans le .def)
    - la dll est en C++, ton programme en C, et celui qui a écrit la dll n'a pas mis les extern "C" devant les prototypes.

    Si ton GetProcAddress foire, tu peux voir si tu récupères un code d'erreur avec GetLastError.

  3. #23
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il y a des cas où l'on ne veut pas utiliser le .lib d'importation, en particulier si on veut un véritable dynamisme (les DLL ne sont pas encore connues au moment où l'on compile le programme, un système de plug-in par exemple).

    La méthode classique dans ce cas est d'avoir dans la DLL une classe qui dérive d'une interface (connue elle du programme principal), ainsi qu'une fonction à la mode C, qui retourne un pointeur sur cette interface. Il n'y aura que par rapport à cette fonction au nom non décoré que l'on devra faire un GetProcAddress, et on pourra par la suite utiliser la classe sans problème par l'intermédiaire de son interface, et sans le moindre .lib.
    Je me trouve actuellement précisément dans ce cas : je ne veux donc pas de .lib.

    Le problème que j'ai, c'est que je fais des appels croisés. Mon programme principal appelle des fonctions de ma DLL, et je récupère donc un accès à ces fonctions dans le programme principal grâce à GetProcAddress. Mais la DLL appelle également des fonctions du programme principal. Que dois-je faire dans ce cas là ?

    Désolé de polluer le fil de discussion... J'espère que ça pourra être utile au posteur initiale et aux autres lecteurs...

  4. #24
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La DLL ne peut pas à la base appeler de fonctions du programme principal (je crois que sous Unix, c'est différent). Le plus simple en général pour gérer ça est d'ajouter un troisième larron :
    - Le programme principal, qui selon les cas peut ne plus faire grand'chose
    - La DLL de plug-in, à laquelle on se lie dynamiquement/tardivement
    - Une DLL qui reprend le cœur des fonctionnalités que va pouvoir appeler à la fois ton programme, et la DLL de plug-in. On peut se lier statiquement avec cette bibliothèque dynamique.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #25
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ou bien, passer un pointeur de fonction (ou d'interface) à la DLL, pour faire un "callback".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #26
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    OK, merci, j'y suis arrivé.

    J'arrive maintenant à charger la DLL et à établir un dialogue bidirectionnel.

    Il me faut maintenant mettre la mains sur un didacticiel sur l'utilisation de DllMain (et de son équivalent sur Linux...).

  7. #27
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par oodini Voir le message
    OK, merci, j'y suis arrivé.

    J'arrive maintenant à charger la DLL et à établir un dialogue bidirectionnel.

    Il me faut maintenant mettre la mains sur un didacticiel sur l'utilisation de DllMain (et de son équivalent sur Linux...).
    En général on n'a rarement besoin de surcharger le DllMain....
    Mais sinon, sous windows, c'est assez simple, il est appelé 2 fois au minium:
    - Quand le process 'load' la DLL pour la premiere fois (que ce soit au lancement, ou lors d'un LoadLibrary)
    - Quand le process 'unload' la DLL.
    Il est aussi appelé à la création de nouveaux 'threads':
    - Quand un nouveau thread est créé (ce qui permet à la DLL de pouvoir instancier ses thread-locals)
    - Quand un nouveau thread est détruit

    A chaque fois on a un paramètre différent.
    http://msdn.microsoft.com/en-us/library/ms682583.aspx
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. System.load() pour charger une DLL : Droit admin nécessaires sous windows 7
    Par Tiberizz dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 07/02/2012, 13h58
  2. Réponses: 4
    Dernier message: 03/08/2007, 12h41
  3. Réponses: 1
    Dernier message: 18/07/2006, 17h44
  4. problemes pour creer une DLL
    Par enkisama dans le forum C++
    Réponses: 2
    Dernier message: 16/06/2006, 13h18
  5. Réponses: 2
    Dernier message: 08/08/2003, 18h30

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