Erreur de mémoire ?

larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005 - 13 oct. 2004 à 13:32
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005 - 13 oct. 2004 à 15:37
Bonjour,

Je viens de réaliser un projet (~2000 lignes) avec C++Builder permettant de gérer des bureaux virtuels.
Ce programme utilise une Dll qui est appliqué sur tous les processus.
Tout fonctionne bien, sauf que par moment , sur certaine application lors de la fermeture seulement (1à2 fois par jour), j'ai le message suivant :

L'instruction à "0x02061bcd" emploie l'adresse mémoire "0x01fe0004".
La mémoire ne peut être "read".
Cliquez sur OK pour terminer le programme.

Ce message est envoyé par l'application que l'on ferme et non par le projet réalisé.
Cela fait un mois que je cherche, et je n'ai aucune idée de ce qui provoque ce genre de message se produisant n'importe quant.

Si vous avez déjà rencontré ce problème, votre expérience est la bien venu.

4 réponses

stephane_1979 Messages postés 9 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 14 octobre 2004
13 oct. 2004 à 13:53
A mon avis t'as pas détruit tout tes objets et pointeurs en quittant l'appli. Verifie que toutes les Zones mémoires réservées sont bien désalouées en fermant.

je connais pas du tout builder C++, mais tu doit pouvoir retrouver ce qu'est l'instruction 0x02061bcd grace au debugger.
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
13 oct. 2004 à 14:11
Je précise que ce message est envoyé lorsque je quitte une application classique comme 'Outlook Express'
et c'est ce même programme qui envoye le message d'erreur.

Mon application n'envoie aucun message d'erreur.

Tu penses que même dans mon cas, si un pointeur toujours présent dans mon programme (pointant sur des données de l'application)
peut générer ce genre de message sur l'application ('Outlook Express') elle-même ?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 oct. 2004 à 14:31
Quand tu injecte une dll dans un processus (par hook par exemple), si cette dll effectue un accès mémoire interdit, c'est le processus cible qui plante et par le processus qui a installé le hook.

=> Il faut vérifier que ta dll n'utilise pas des pointeurs venant d'autre processus (en particulier celui de ton appli installant les dlls)
0
larion Messages postés 140 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 21 juillet 2005
13 oct. 2004 à 15:37
Merci de vos réponses, j'ai enfin compris avec certitude d'ou venais les problèmes. C'est bien la Dll, je m'en doutais mais vous m'avez donner l'explication.

Une autre découverte :
Je viens de découvrir qu'une application me donne à chaque fois cette erreur. C'est une aubaine, je vais pouvoir résoudre rapidement ce problème.
La fenêtre en cause c'est le "Comptes d'utilisateurs" dans le panneau de configuration.

Dans la DLL c'est le Hook suivant qui génère l'erreur :

LRESULT CALLBACK _export CallWndRetProc(int nCode,WPARAM wParam,LPARAM lParam)
{ if(nCode == HC_ACTION)
{ PCWPRETSTRUCT Param = (PCWPRETSTRUCT)lParam;
.....
}
return CallNextHookEx(Donnees->HookHandle2,nCode,wParam,lParam);
}

Et ce qui provoque l'erreur sur la fermeture de la fenêtre "Comptes d'utilisateurs"
c'est le "return CallNextHookEx"
Ce Hook ce lance, parce que lorsque l'on ferme une fenêtre, un WM_ACTIVATE est lancé par windows.
Là, je ne comprends pas pourquoi, mais je pense pouvoir résoudre cette erreur.
0
Rejoignez-nous