Une DLL non active ne veut plus se decharger

Résolu
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 3 oct. 2008 à 17:31
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 7 oct. 2008 à 23:00
Bonjour à tous

Il m'arrive un phenomene tres etrange.
Je me suis créé une DLL non active X tres simple et depuis quelques heures pas moyen de la decharger en une seule fois.

Que ce soit par le methode LoadLibrary ou bien juste en la declarant, pour la decharger, je suis obligé de faire un FreeLibrary à deux reprises.

Quelqu'un aurait il une idée d'ou viens mon probleme, car cela m'inquiete grandement

Merci de votre aide

12 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 oct. 2008 à 21:35
Ouais...
Je t'ai dit certaines choses ===>> tu ne me parais pas les avoir comprises...
Je t'ai cité (certes en anglais) l'extrait d'un lien ===>> tu ne sembles pas en avoir compris le sens exact ...
Je te parle de comptage de librairies mappées et tu ne me parais pas savoir à quoi celà correspond...
Tu reviens inlassablement avec ce qui semble te "frapper", à savoir je ne sais quoi à propos de (maintenant) handles "à la queue leu leu"... et de "décalages"...
Je t'ai conseillé de te contenter de te servir de ce que te retournait LoadLibrary (à mettre dans une variable publique) pour t'en servir pour décharger (dans ton FreeLibrary)...===>>W> tu n'en tiens aucun compte !!!
Je te laisse donc là à tes alchimies... et te conseille d'ouvrir une discussion sur Windows et non VB6...
Amitiés
3
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
3 oct. 2008 à 17:37
J'ai rajouté les ligne en bleu
 
Dim HwndMaDll As Long
HwndMaDll = LoadLibrary(RepSysteme + "MaDll.dll")

If  HwndMaDll Then
 -
 -
End If

 While GetModuleHandle(RepSysteme + "MaDll.dll")
  FreeLibrary (HwndMaDll)
 Wend

Mais ça reste du bricolage
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
3 oct. 2008 à 18:21
J'ai maintenant apparement un nouveau probleme.
J'ai bien fermé ma fenetre.
Mais quand j'essaye de rappeller ma DLL, avec la meme fonction j'ai un beau panneau "la memoire ne peut pas etre READ" et ça ferme carement l'editeur VB

Je sais plus quoi faire, pitié au secour !!!!!
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
3 oct. 2008 à 18:43
Bonjour,


Bricolage = quelquefois risque ...


As-tu lu ? (en anglais... désolé) :



"The GetModuleHandle function returns a handle to a mapped module . Therefore, use care when passing the handle to the FreeLibrary functioncan cause a DLL module to be unmapped prematurely".
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
3 oct. 2008 à 22:29
Re...
Et pensant que nous y sommes :
Vas donc voir mon message sur ton autre discussion (celle où tu as validé ta propre solution)...
Je voudrais ajouter ceci, puisque les "circonstances" nous y conduisent :
Il est important, lorsque l'in utilise une fonction de l'Api de Windows, de ne pas le faire avant d'avoir tout lu et tout bien compris de ce qui la concerne...
Cette recommandation n'est pas là que pour toi. Elle s'adresse à tous ceux qui se "lancent" sans réfléchir dans toutes sortes de directions, et terminent généralement par des copier/collers non compris et très approximatifs ...
Bonne nuit.
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
5 oct. 2008 à 17:54
Bonjour JmfMarques

Tout d'abord merci de ton aide.
Tu as raison, sur le fait que je ne comprend rien aux API et que je les utlisent surement tres mal.
Mais tu sais, je suis un debutant tout seul dans son bureau et qui ne peut compter que sur l'aide de gens bénévoles comme toi et ceux de ce, ou bien les autres forums.
Car de plus, je comprend tres mal l'anglais, donc quand je commence à lire plus d'une ligne d'anglais, plus je lis et moins je comprend.
Alors ce n'est pas faute d'essayer, crois le bien.

Quand je pose une question sur ce forum, c'est que j'ai bien cherché et que je suis désespéré.
Je continue de chercher en parallele et quand je crois trouver une solution, je la met vite de façon à ne pas faire perdre votre temps precieux, et que vous le consacriez à un autre copain qui en a plus besoin que moi.
J'espere de plus que si ma solution n'est pas bonne ou pas optimale, on me corrige au passage, et que dans le cas contraire cela confirme que j'ai trouvé une solution satisfaisante

J'avais cru trouver la réponse à ma solution et apparement, d'apres ce que dis ta ligne en anglais que j'ai à moitié comprise, cette API ne retourne pas le vrai handle, mais une copie, c'est ça ???
Mais alors, j'en reviens à ma question de l'autre POST.....comment fait on quand on a perdu le handle d'une DLL pour le connaitre , si ce n'est avec GetModuleHandle ????
Et aussi comment est on sur qu'elle est bien libérée de la mémoire ???

Merci beaucoup à nouveau de ton aide
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 oct. 2008 à 12:13
Je crois tout simplement que tu devrais te contenter de mettre ton handle HwndMaDll en variable publique, de ne charger qu'une fois et de décharger également une seule fois, sans nécessité aucune de te lancer dans des opérations scabreuses à l'aide de GetModuleHandle ...
Celà reste tout-à-fait à la hauteur de tes connaissances.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 oct. 2008 à 12:18
Re,

J'ajoute que tout celà relève mille fois plus de la connaissance de Windows que de celle de VB6 (la prtésente section)....
C'est toujours le cas lorsque l'on veut se servir directement des fonctions de  l'Api de Windows
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
6 oct. 2008 à 12:33
Ne crois surtout pas que j'essais d'etre malin avec des fonctions que je ne connais pas pour jouer au "vrai programmeur"
Je suis nul et j'en suis conscient, et donc je ne m'avaneture que le moins possible dans les API.

Mais j'ai eu un plantage lors du dechargement de ma DLL standard et depuis je me fais un soucis monstre car toute ma programmation depuis 2 ans est basée sur ces echanges.
Alors je me dis que si je gere mal mes DLL il serait peut etre temps de mettre les instruction qu'il faut.

C'est pourquoi quand j'ai voulu vérifier comment voir si une DLL est reellment dechargée, j'ai trouvé cette API "GetModuleHandle"
Et j'ai cru naivement que si je faisait appel à elle apres le FreeLibrary, je pourrais confirmer le dechargement de cette derniere si j'avais un retour different d'une adresse memoire.

Comment ferais tu toi pour etre sur qu'une DLL standard a bien été déchargée de la mémoire ????
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 oct. 2008 à 13:10
C'est toi, qui sais quand tu l'as chargée en mémoire, non ?
C'est donc toi, qui sais quand la décharger (lorsque tu l'as utilisée)... non ?

Dans l''état actuel des choses, ami : je ne sais pas où tu en es des dégâts potentiels (ceux qui ont pu être faits sur ta machine en matière d'enregistrement d'une, voire plusieurs, dll, dont le N° de comptage a pu être bouleversé par ta boucle avec FreeLibrary !!!)...

Je m'abstiens de toute conclusion et t'engage à tout contrôler, maintenant ... à moins que tu ne décides de tout réinstaller....
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
6 oct. 2008 à 13:19
Dans l''état actuel des choses, ami : je ne sais pas où tu en es des dégâts potentiels (ceux qui ont pu être faits sur ta machine en matière d'enregistrement d'une, voire plusieurs, dll, dont le N° de comptage a pu être bouleversé par ta boucle avec FreeLibrary



Allez vas y, fais moi encore plus peur.
Tu veux dire que les handles sont comme dans un tableau à la queu leu leu ???
Et que lorsque l'on libere plusieures fois le meme handle on decale tout ????

Et qu'il n'y a aucun moyen de connaitre le veritable handle d'une DLL et par cette methode on ne peux pas verifier si elle est toujours en memoire ??? ou correctement libérée ???
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
7 oct. 2008 à 23:00
Croire que je n'ai pas tenu compte de tes conseils est une lourde erreur.
Je respecte tes paroles et ton savoir bien plus que tu semble le croire, ou tout du moins que je ne le laisse transparaitre.
Evidemment que je vais me servir du handle retour du LoadLibrary.

Mais cela ne repond pas à ma question, comment s'assurer qu'une DLL est bien libérée ???

Lorsque l'on demande le handle d'une fenetre avec l'API FindWindow on obtiens bien une reponse, j'avais juste du mal à comprendre pourquoi c'est simple avec une fenetre et peu simple, voir impossible avec une DLL.
Ce sont bien tout des adresses mémoires.
C'est certain que l'ignorance va de paire avec la pretention.

Je pensais juste qu'il existait une API "Fiable" qui retournait un 0, si la DLL etait déchargée, ou bien quelques lignes qui pouvaient assurer cette fonction.
C'est peut etre impossible, ou bien tres compliqué, je n'en sait rien, puisque je ne sais rien.

Quoi qu'il en soit, je te remercie beaucoup de ton aide, ainsi que de celles que tu m'as apporté auparavant sur d'autres POSTS.
Et excuse moi de t'avoir paru irrespectueux, il faut mettre cela sur le compte de l'ignorance du jeune apprenti

Excuse mon insistance, mais si il te parviens un jour une idée, ou bien tu croise un code qui fait la fonction que je recherchais, n'hésite pas à relancer le "boulet"
Je te souhaite une excelente, soirée.
0
Rejoignez-nous