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 :

Chargement de librairie DLL


Sujet :

Windows

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut Chargement de librairie DLL
    Bonjour,
    j'ai un petit souci...
    je m'explique.

    Je dispose d'une librairie dynamique (.dll) qui contient une fonction
    Je charge ma librarie via LoadLibrary et recupere l'adresse de ma fonction via getProcAdress.
    Jusque la aucun probleme.
    Je fais les memes operations dans un thread... aucun probleme.

    Mais lorsque j'appele ce programme dans un thread d'un autre programme le chargement de la librarie se bloque !!!
    Pourquoi ?

    J'espere que c'est assez clair sinon demandez moi.
    Merci d'avance.
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  2. #2
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Tu restes bloqué sur LoadLibrary ??
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Exactement !

    Pour le savoir je mets un Beep avant et un Apres...
    Le programme ne se tue pas non plus.

    Il est juste bloqué sur le loadLibrary !
    Je rappelle mon probleme:
    Exe -> loadLibrary : OK
    Exe -> Thread -> loadLibrary : OK (Nommons le exe1)
    Exe -> Thread (l'exe1 du dessus) -> Thread -> loadLibrary : ERREUR

    J'ai aussi remarqué dans l'exe (celui qui appelle le thread chargeant la librarie et qui se bloque) et bien se débloque lorsque j'essaye de charger ma librarie.

    Pour résumer:
    Exe -> Thread (exe1) -> Thread -> loadLibrary : BLOCAGE

    Mais si je fais:
    Exe -> Thread (exe1) -> Thread -> loadLibrary : BLOCAGE
    -> loadLibrary : DEBLOCAGE !

    Bizzare....

    Merci pour vos future réponse...
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Je confirme que le loadLibrary se bloque dans ce cas (loadlibrary appelé dans un thread d'un exe qui lui méme est appelé dans un thread d'un autre exe ! ouf )

    J'ai une petite astuce pour le debloquer.

    Je charge ma librarie au lancement du programme, ainsi je peux charger ma librairie autant de fois que je veux dans mes threads, le loadLibrary ne se bloque pas.

    Par contre je n'ai pas d'explication pour ce phénomene...

    Pourquoi dois je la charger au moins une fois ?
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    LoadLibrary n'est pas (directement) en cause. Lors d'un load de base, le DllMain reçoit au moins DLL_THREAD_ATTACH. Si le DllMain de la dll est buggé, ben voilà ça bloque... Note que ça peut aussi se produire dans une dll utilisée par ta dll.

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Merci pour tes informations...

    Mais pourtant mon DllMain est classique (enfin je pense)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int WINAPI DllMain()
    {
    return (1);
    }
    ???? (Je n'arrive pas à faire le lien avec tes infos)
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Il semble que tu aies raison et que le probleme ne vienne pas de loadlibrary lui même

    En effet le loadLibrarry fonctionne tres bien dans tout les cas si je le realise en section critique.

    Je pense donc que le thread "passe la main" à un autre thread lorsqu'il realise son DllMain !?

    J'aimerai bien ne pas utiliser les sections critiques ?
    Y a t-il une autre méthode pour résoudre mon probleme ? (outre les méthodes utilisant mutex,... les méthodes du même style)
    Dois je changer mon DllMain ? Le modifier ?
    Comment faire ?

    Merci d'avance pour vos réponses.
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    J'ai du mal à suivre. Où est la section critique ?
    C'est ta dll que tu charges ? Que fait-elle (dépendances...) ?

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Je ré-explique:

    Un processus crée un thread qui appelle LoadLibrary

    Pour eviter le blocage je passe en section critique avant le loadLibrary et j'en sors apres avoir réalisé le loadLibrary
    A croire que le chargement se fait bien...

    Voila pour l'explication

    Je vais faire d'autres tests et je vous tiendrai au courant.
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  10. #10
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Je vois pas trop l'utilité de la section critique du coup...
    A moins que tu aies d'autres threads qui partagent cette section critique.

    En tout cas si il existe qu'un seul thread dans l'ensemble des threads du process qui utilise une section critique alors elle n'a a priori aucun effet...

    En tout cas d'après ce que je comprends des sections critiques tout comme les sémaphores par exemple il faut être au moins deux pour que cela ait un sens...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    C'est ta dll que tu charges ? Que fait-elle (dépendances...) ?
    ta dll utilise d'autres dll ? Elle fait quoi ?

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Ma dll n'utilise pas d'autre DLL
    Elle contient diverses fonctions, rien de plus !
    Je vais essayer avec un dll vide mais bon je ne pense pas que le probleme vienne d'ici.

    Le truc c'est que ca marche bien si je lance l'exe (qui appelle le thread qui loadLibrary)

    Alors pourquoi ca bloque si je lance cet exe dans un autre exe via un process !?

    Et pourquoi ca fonctionne si au lieu de charger ma librairie dans un thread je la charge dans le main de l'exe et passe en extern le pointeur sur la lib chargé ?

    Je ne comprends pas tout !
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Tu peux poster un bout de code minimal qui reproduit le problème ?

  14. #14
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Je vais essayer de faire un petit projet exemple...
    Mais pour l'instant je n'ai pas de temps.

    Mais j'avoue qu'on s'y est mis a plusieurs et que même le débuggage n'a rien apporté de plus...
    Le système plante sur le loadLibrary et rien de plus !

    Merci en tout cas pour vos infos...

    Le probleme reste non résolu...
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Je pense que je me casse la tête sur le même problème que toi. Je viens de tomber la-dessus, jette un oeil et tiens-nous au courant:

    http://msdn2.microsoft.com/fr-fr/lib...48(VS.71).aspx

    A+,

    Bouillou

Discussions similaires

  1. [Lazarus] Chargement de librairie (DLL)
    Par bubulemaster dans le forum Lazarus
    Réponses: 2
    Dernier message: 03/11/2007, 20h48
  2. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56
  3. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18
  4. [UNIX Forte 6.1 G++] pbl chargement de librairie partagée
    Par claudio.matzke dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/10/2003, 14h45
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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