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 :

dll et variables static


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut dll et variables static
    Bonjour a tous,
    Je me suis décidé a m'insrire sur ce forum car j'ai un gros problème existanciel lié au dlls.
    En effet depuis ma première implementation de dll l'existance des static dans mon code a été remis en cause.

    Je sais d'un amis que la dll a sa propre mémoire et que donc quand un static est declaré dans une classe il en existe deux instances. Une dans la library static (ou .exe) et une dans la zone mémoire de la dll. Ma première implementation ayant confirmé le problème, je me suis dit que la solution était d'initialiser deux fois le static dans le cas des singletons.
    Sa marche dans le cas des singletons, car le static ne change pas au cour de l'execution du programme.

    Mais quid des statics a valeur variable comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #ifdef STATIC
    #	define DYN_LIBRARY
    #else
    #	ifdef DLL_EXPORT
    #		define DYN_LIBRARY __declspec(dllexport)
    #	else
    #		define DYN_LIBRARY __declspec(dllimport)
    #	endif
    #endif
     
    class DYN_LIBRARY Object
    {
         static Int32 _NbObjects; // Number of objects in the scene
         Object();
    }; 
     
    Object:: Object()
    {
         ++_NbObjects;
    }
    Comment faut il faire ? Y a t'il une option de compilation pour que les statics soit globaux ? Ou alors la solution est elle de ne pas utiliser les static dans les dlls ?
    Merci à vous,

    --
    Al'

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je ne suis pas sûr de comprendre mais une variable static dans une class est toujours globale soit un seul exemplaire pour toutes les instances

    Pour ton ami il nous faudrait qu'il donne une référence de ce qu'il avance.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    Et bien dans le cas d'une dll il semble que ce soit le cas, a moi qu'on se fourre le doigt dans l'oeil jusqu'à l'omoplate ( ce qui n'est pas impossible quoique je pense que je l'aurais senti)
    Donc si tu as raison j'ai mal fait mes export.

    Voila comment je procede: dans un fichier common.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef STATIC
    #	define DYN_LIBRARY
    #else
    #	ifdef DLL_EXPORT
    #		define DYN_LIBRARY __declspec(dllexport)
    #	else
    #		define DYN_LIBRARY __declspec(dllimport)
    #	endif
    #endif
    ensuite je defini
    • STATIC dans les preprossesors de mes lib
    • DLL_EXPORT dans mes dll
    • et rien dans mon .exe

    Ensuite absolument toutes mes classes sont définie de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class DYN_LIBRARY ClassName
    {
    };
    Ensuite je fais soit un LoadLibrary() soit je link le petit .lib généré avec la dll.

    J'éspere que quelqu'un vas pouvoir me répondre.. je commence à avoir des doutes quand a l'existance de cette zone mémoire. Même si elle a l'air bien réelle sur mon programme.

    Merci a ceux qui se pencherons sur le problème.

    --
    Al'

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je sais d'un amis que la dll a sa propre mémoire et que donc quand un static est declaré dans une classe il en existe deux instances.
    2 instances de quoi ?

    Tu dis que tu as reproduit le probléme comment tu t'y es pris et quel est le résultat ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je sais que lorsqu'on a plusieurs projets qui lient avec une même bibliothèque statique ils ont chacun leurs instances des variables statiques, mais je suis plus sceptique quant aux bibliothèques dynamique, je ne pense pas que pour elles le problème subsiste.

  6. #6
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Est-ce que cela ne dépend du placement de la variable (placement en mémoire partagée ou non)?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    Salut a tous,
    Le problème venait du fait que la classe presente dans la dll héritait d'une classe qui était compilée dans une lib static. Ce qui avait pour effet de créer deux copies du static.
    En bougant la classe de base dans chaques dll qui en avait besoin, j'ai resolu le problème.
    Cette zone mémoire existe donc bel et bien.

    Voila donc et merci à tous,
    --
    Al'

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

Discussions similaires

  1. DLL et variables static
    Par LittleDev dans le forum Windows
    Réponses: 1
    Dernier message: 12/09/2008, 16h02
  2. Dll et Variables Globales
    Par scelines dans le forum C++
    Réponses: 7
    Dernier message: 23/08/2005, 17h20
  3. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

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