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

Windows Discussion :

plusieurs questions sur les Dll


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Points : 33
    Points
    33
    Par défaut plusieurs questions sur les Dll
    Bonjour,
    J'ai cherché des renseignements à propos des librairies sur le net mais quelques points restent encore vague. Le fonctionnement est sous windows.

    1. Quelles différences y-a-t'il entre librairie statique et Dll. Librairie statique ne fournit q'un .LIB.

    2. Si j'ai un programme qui accède à une Dll A. dans la fonction de la Dll A, j'appelle une fonction de la Dll B qui met à jour une variable globale pour la Dll B.
    Une fois terminé ce traitement, je retourne à mon programme principal. J'appelle une autre fonction de la Dll A qui appelle à nouveau une fonction de la Dll B qui accède à la variable globale.
    La première valeur de la variable globale est elle gardée? Je ne charge pas la Dll avec un loadLibrary.
    Ma variable globale est une structure contenant plusieurs champs dont l'adresse d'une fonction. Lors du premier appel à la DllA, j'appelle une fonction de la DllB en lui passant une adresse qui correspond à une fonction de la Dll A(fonction non exportée). Lors du second appel, je veux appeler depuis la DllB la fonction de la DllA.
    Tout fonctionne correctement jusqu'à ce que je fasse appel à cette fonction. J'ai une erreur de windows "privileged instruction". J'ai l'impression en débuggant que l'adresse de la structure est conservée mais pas ses champs.
    Ce fonctionnement marche lorsque DllA est un programme directement. Ce problème peut il êtru dû au fait que la fonction que je veux appeler soit dans une Dll et ne soit pas exportée ou peut on quand même appeler la fonction si on connait son adresse?

    Merci.

  2. #2
    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 519
    Points
    41 519
    Par défaut
    1. Bibliothèque statique : Les fonction du .lib nécessaire au programme sont directement recopiées dans le .exe. Si tu as une fonction volumineuse utilisée dans 1000 programmes, tu auras 1000 exe avec cette fonction dedans.
      Et si tu mets à jour ta bibliothèque, tu devras forcément relinker tous les exes.

      Bibliothèque dynamique : Le .DLL contient toutes les fonctions, le .lib généré sert à linker le programme à la DLL sans faire de LoadLibrary().
      Dans l'exemple précédent, tu auras 1000 exe sans la fonction et 1 DLL qui la contient.
      Et si tu mets à jour la bibilothèque, avec un peu de chance tu n'auras pas à relinker les exes (je pense que si toute l'interface de la DLL est extern "C", tu n'en as jamais besoin. Des DLLs comme les DLL d'extension MFC, qui sont en C++, font souvent planter si on ne recompile pas le programme qui les utilise).
      .
    2. Une DLL chargée dès le début du programme reste généralement chargée pour toute la durée du process, donc ta variable globale devrait être bonne.

      Et comme tout est dans le même process, normalement les échanges de pointeurs, surtout des pointeurs de fonction, peuvent se faire sans problème.
      Par contre, ce qui est alloué (malloc, new) par une fonction d'un exe/dll doit être désalloué par une fonction du même exe/dll.
      Il faut aussi faire attention avec les flux (FILE* ou iostream) si les DLLs sont liées avec la version statique de la C RunTime Library.
    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.

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    please ?

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut soucis de globales et statiques
    Coucou,

    non en fait je crois que les variables globales, tout comme les variables statiques, ne sont pas du tout synchronisés entre le programme appelant et la Dll appelée.
    Par exemple, si tu travailles sur deux projets, qui utilisent une libraire commune, contenant un singleton défini comme variable globale ou statique, cette variable sera toujours à sa valeur initiale dans la Dll si tu as crée le singleton dans le programme appelant :
    librairie Core contient singleton pCore A et,
    librairie Soft B lié à A en mode Exe
    librairie Middleware C lié à A en mode Dll
    => B crée A, puis appelle C, le singleton pCore de C sera nul alors qu'il a été crée dans B.

    Sinon l'un des avantages interessants des Dlls, c'est de travailler en créant un programme principal qui utilise des petits modules sans réellement savoir ce qu'ils font. Et du coup tu peux donner une version finale d'un programme qui va potentiellement charger de nouvelles fonctionnalités dans des Dlls (c'est l'idée des Plug ins)

    à plus

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Points : 33
    Points
    33
    Par défaut
    OK, merci pour vos réponses qui m'ont éclairées.
    Pour le résolu, je ne travaille pas encore le week-end d'où ce petit temps depuis la réponse

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

Discussions similaires

  1. Questions sur les DLLs
    Par DeLaFonk dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2012, 13h57
  2. Plusieurs questions sur les connexions
    Par Vince7-7 dans le forum Informatica
    Réponses: 1
    Dernier message: 28/12/2011, 22h25
  3. Question sur les dll
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 29/04/2005, 17h36
  4. Question sur les DLL
    Par Hellmout dans le forum MFC
    Réponses: 7
    Dernier message: 22/10/2004, 02h51
  5. Réponses: 4
    Dernier message: 11/09/2004, 16h38

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