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 :

Plantage avec FreeLibrary


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut Plantage avec FreeLibrary
    Bonjour,

    J'ai un souci avec la fonction FreeLibrary.
    Depuis mon éxécutable je charge sans problème une DLL
    qui s'éxécute normalement. Mais, au moment de libérer celle-ci
    avec la fonction FreeLibrary les choses se corsent. En debuggant
    j'ai pu vérifier que FreeLibrary retourne zéro, càd que la fonction échoue.
    Le hic c'est que le programme ne plante pas à ce moment là mais plus
    tard au moment où je le quitte (The instruction at "0x327273cc" referenced memory at "0x01b0e8f0". The memory could not be "read".).

    J'ai testé sans la fonction FreeLibrary et là tout roule. Quand je quitte
    le prog aucun accroc.

    Voici un extrait montrant le lancement de la DLL. Est-ce que ça inspire quelqu'un ?


    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
     HINSTANCE hinstDLL;
     DLLFUNC ImpFuncDLL;
     BOOL fFreeResult;
    
      if (hinstDLL=LoadLibrary ("coocs.dll"))
    		  {
    		   ImpFuncDLL=(DLLFUNC)GetProcAddress(hinstDLL, "DLLCoocsMain");
    		   if (ImpFuncDLL)
    				{
    				 ImpFuncDLL(BaseLex3, NbFormesPoles, NumFormesPoles, FqMin, SpMin, TailleFenMots, ImpCtxRenc,
    				 DelimFenM.c_str(), DelimPhra.c_str(), DelimPara.c_str(), FormFenJauge->Handle, FormFenJauge->ProgressBar);
    				}
    		   else
    				{
    				//ErrorInfoMessage(30);
    				return false;
    				}
    
    		  fFreeResult=FreeLibrary (hinstDLL);     // Cette commande plante le prog !!!
    		  }
    		  long h=1;
      //else ErrorInfoMessage(30);
    }

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    cette dll ("coocs.dll"), est-ce une dll que tu as implémenté toi-même? En as-tu les sources? Il y a peut-être un soucis au niveau du point d'entrée sur DLL_PROCESS_DETACH.

    Ton appli est-elle multi-thread?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    as tu essayé de mettre le freelibrary en dehor de ton if ?
    ou essayer de caster FreeLibrary ( (HINSTANCE) hinstDLL)

  4. #4
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut
    Merci pour vos suggestions !

    Oui, la dll je l'ai implémenté moi-même et j'ai les sources.
    Mais je ne comprends pas à quoi tu fais allusion avec le point d'entrée sur DLL_PROCESS_DETACH.
    Mon appli est-elle multi-thread?
    Je ne crois pas, du moins je n'ai rien fais en ce sens.

    Quant au casting HINSTANCE ça donne rien, ni dans la boucle ni dehors.

    ...?

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    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 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par devroot
    En debuggant
    j'ai pu vérifier que FreeLibrary retourne zéro, càd que la fonction échoue.
    que renvoie GetLastError() ?

    Compile ta dll en debug et assure-toi que le fichier pdb se trouve au meme endroit qu'elle. Si ca crash dans ta dll, le debuger devrait te conduire a l'emplacement de l'erreur (si c'est une dll développée avec VC++).

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par devroot
    je ne comprends pas à quoi tu fais allusion avec le point d'entrée sur DLL_PROCESS_DETACH.
    Normalement, le main de ta dll devrait ressembler à cela:
    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
    BOOL WINAPI DllMain (HINSTANCE hModule, DWORD  ulReasonCalled, LPVOID lpReserved)
    {
    	switch (ulReasonCalled) 
    	{
    	case DLL_PROCESS_ATTACH:
    		// code
    		break;
    
    	case DLL_THREAD_ATTACH:
    		// code
    		break;
    
    	case DLL_THREAD_DETACH:
    		// code
    		break;
    
    	case DLL_PROCESS_DETACH:
    		// code
    		break;
    	}
    
    	return TRUE;
    }
    le case DLL_PROCESS_DETACH est celui qui est utilisé lorsque FreeLibrary est appelé.

    Sinon, débugger à l'intérieur de la dll est la meilleure solution pour trouver le bug. Aurélien t'as donné toutes les billes. A toi de jouer

  7. #7
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut
    En fin de compte j'ai essayé un appel statique de la DLL et là ça marche
    sans problème ?!?

    Bon, c'est vrai que j'esquive le problème et il faudra éventuellement que j'y revienne car les premiers tests tendent à confirmer qu'il y auriat une fuite de mémoire dans la DLL...

    En tout cas merci les gars !

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

Discussions similaires

  1. Plantage avec Partition Magic 8 !
    Par Jeff on the web dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 13/07/2006, 15h02
  2. plantage avec une division par 0
    Par wauant dans le forum Windows Vista
    Réponses: 2
    Dernier message: 04/07/2006, 09h04
  3. Réponses: 9
    Dernier message: 17/03/2005, 18h02
  4. Plantage avec la fonction InvalidateRect
    Par SebCBien dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/01/2004, 21h32
  5. Pb de configuration postgre -> plantage avec DB error
    Par liv dans le forum Installation
    Réponses: 6
    Dernier message: 05/11/2003, 19h07

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