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

MFC Discussion :

Décharger une librairie dynamiquement


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut Décharger une librairie dynamiquement
    Bonjour,

    Je travaille avec un logiciel qui charge un certain nombre de DLL, dont certaines que j'ai eu la joie d'écrire. Aujourd'hui, je voudrais en faire une nouvelle qui force le déchargement d'une autre car elle consomme trop de mémoire pour certaines opérations (en tant normal elle est utile, mais pour certains gros traitements, il est préférable qu'elle ne soit pas là). Je voudrais éviter à l'utilisateur la peine de quitter le logiciel, supprimer la dll temporairement et relancer le logiciel pour faire l'opération inverse 1h plus tard. Bien entendu, je ne dispose pas du code de cette dll qui m'embête.

    En gros, j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HMODULE madll = GetModuleHandle("MaDll.dll") ;
    if (!AfxFreeLibrary(madll)
    {
         AfxMessageBox("Impossible de décharger MaDll.dll") ;
    }
    La MessageBox n'étant jamais affichée, j'en déduis que tout s'est bien passé, mais dès que je veux reprendre la main sur mon logiciel (quelque soit l'opération que je veux faire), j'ai droit au plantage violent
    0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
    Ma question est donc : ai-je oublié quelque chose de primordial ? Ou alors suis-je un doux rêveur de penser que je peux décharger une dll comme ça ?

    Merci

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    C'est le thread qui a monté la dll en mémoire qui doit la libérer, sinon ça te donne un heap corruption (ton cas présent!).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    Merci pour ta réponse.

    Si je comprends bien je suis un peu foutu. C'est le thread principal qui a monté la dll, donc je pense l'objet CWinApp appelé souvent theApp. Mais ensuite je ne vois pas bien comment lui dire de décharger une dll si ce n'est en surchargeant ExitInstance, bref une fois que tout est fini est qu'il est trop tard...

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Une méthode simple peut être de déléguer à une autre dll toutes les instanciation/libération des autres dll. Ainsi cette dll proposera des points d'entrée que tu n'auras qu'à monter dans ton thread principale (pour appeler l'instanciation) et dans ton autre dll avec laquelle tu souhaites libérer.

    Tu vois ce que je veux dire ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    Oui j'ai compris
    J'ai déjà utilisé ce genre d'astuce pour autre chose, mais j'avais complètement oublié que je pourrais très bien faire ça ici aussi.

    Merci beaucoup !

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Moi, j'ai rien compris mais je suis en plus un gros fainéant.
    Et mon arme de fainéant, c'est /delayload.
    http://msdn.microsoft.com/en-us/libr...v=VS.100).aspx

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    Ça marche du tonnerre maintenant ! Je n'ai pas vraiment essayé ta solution bacelar, à vrai dire, je n'ai pas vu en quoi elle simplifiait le code. Mais merci quand même, j'ai appris pas mal de choses en lisant cette partie de MSDN.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Pas, ça simplifie le code car vous n'avez plus besoin de code pour faire le chargement dynamique et le déchargement est des plus simple.

    Pas de code = simplification

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

Discussions similaires

  1. Extraire les objets d'une librairie dynamique
    Par Lapk_gre dans le forum C
    Réponses: 13
    Dernier message: 29/07/2008, 14h49
  2. Linker une librairie dynamique
    Par Mathieu.J dans le forum Linux
    Réponses: 2
    Dernier message: 29/10/2005, 19h18
  3. Recompiler une librairie dynamique (DLL) en statique
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 07/04/2005, 19h28
  4. Compiler et créer une librairie dynamique en C
    Par fidififouille dans le forum Linux
    Réponses: 3
    Dernier message: 30/11/2004, 16h36
  5. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17

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