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++Builder Discussion :

[DLL][Singleton] Doublon d'instance :(


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut [DLL][Singleton] Doublon d'instance :(
    Bonjour,

    Je viens de rencontrer un problème dont je ne pensais pas que cela pouvait arriver.

    Je me suis créé un Singleton dans une DLL. Ce Singleton est initialisé via le DllEntryPoint, mais chose surprenante, ce dernier est initialiser deux fois de suite, alors que cela ne devrait pas être le cas.

    Quand je regarde la DLL au debugger, je vois que l'on passe plusieurs fois dans le DllEntryPoint, alors que le soft qui test, est un bête console ( mono-thread ) qui est linké statiquement au .lib de mal DLL.

    Le problème, est que j'ai deux instances de mon singleton.

    Quelqu'un aurait-il une petite idée pour résoudre mon problème ?

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    La fonction DllEntryPoint est appelée plusieurs fois lors de la liaison de la DLL par un processus ou lorsqu'elle est détachée (regarde l'aide de "DllMain").

    Il faut consulter les valeurs du paramètre "reason":

    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
    21
    22
    23
    24
    25
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
      // The library is attached to a process
      if (reason==DLL_PROCESS_ATTACH) {
     
     }
     
      // The library is attached to a thread
      if (reason==DLL_THREAD_ATTACH) {
     
     }
     
      // If the thread detaches from the library
      if (reason==DLL_THREAD_DETACH) {
     
      }
     
     
      // If the process detaches from the library
      if (reason==DLL_PROCESS_DETACH) {
     
      }
     
      return 1;
    }
    Perso, je fais mon singleton avec une variable boolean globale de la DLL (mais ma DLL n'est pas appelée par plusieurs applications en même temps, donc je ne sais pas si ça marche dans ce cas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bool loadedSingleton=false;
     
    code]int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
      // First call
      if (loadedSingleton==false) {
        // initialisation du singleton
        ...
        loadedSingleton=true;
     }
     
      return 1;
    }

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    A quoi sert ta variable globale étant donné que l'utilisation d'un Singleton, est d'avoir effectivement une seule instance d'une classe ?

    De mon côté, j'ai un peu regardé sur MSDN, et j'ai trouvé CreateFileMapping, qui permet de créer une zone mémoire partagée nommée.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'utilise une variable globale car mon singleton est local à la DLL. Si tu veux avoir un "vrai" singleton au niveau de tout Windows, alors je pense que tu pourrais utiliser un mutex. Je ne l'ai jamais fait, mais tu peux t'inspirer de ce tutorial ou de ce post.

    Je suis intéressé à connaître la solution

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    moi aussi je suis intéressé lol :p

Discussions similaires

  1. GWT/GXT un singleton ou une instance d une autre classe
    Par miya dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 10/03/2010, 09h13
  2. [C++] DLL Multiples instances
    Par ouquoi dans le forum C++
    Réponses: 2
    Dernier message: 18/07/2006, 16h25
  3. Singleton sur plusieurs DLL
    Par 10_GOTO_10 dans le forum C++
    Réponses: 29
    Dernier message: 28/04/2006, 11h14
  4. Plusieurs instances d'un singleton pour plusieurs modules
    Par zoubidaman dans le forum C++Builder
    Réponses: 10
    Dernier message: 18/11/2005, 01h44
  5. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07

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