Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
864 connectés 

  FORUM HardWare.fr
  Programmation

  [C++/MFC] pb avec la méthode DestroyWindow( )

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++/MFC] pb avec la méthode DestroyWindow( )

n°82458
El_gringo
Posté le 18-12-2001 à 14:29:52  profilanswer
 

c très simple à expliquer:
j'utilise une boite de dialogue non modale.
Quand on crée la fenêtre, je vérifie si un Hwnd est déja associé à l'instance (unique) de la classe de ma boite de dlg non modale.
Si le Hwnd associé est NULL, il faut créer le fenêtre, je fais donc un Create sur l'instance. jusqu'ici, tout vas bien...
Dans ma classe de boite de dialogue non modale, je surcharge le OnClose (méthode appelée à la fermeture de la boite de dialogue), pour y faire un DestroyWindow() (essenciel, si je veux que le Hwnd de l'instance de la classe de ma boite de dialogue non modale soit remis à NULL).
Sachant ça, qqn saurai il pourquoi, après 3 ou 4 ouvertures puis fermetures de cette boite de dialogue (3 ou 4 appels de Create, puis de DestroyWindow), ça plante. Je peux juste dire que, Si l'appel de Create n'est pas fait pour la 1ère fois, j'ai des violation d'accès:
 
First-chance exception in ClipScan.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
 
j'en ai marre... c chiant ces petits pb qui font que ton appli n'est pas diffusable !

mood
Publicité
Posté le 18-12-2001 à 14:29:52  profilanswer
 

n°82540
youdontcar​e
Posté le 18-12-2001 à 19:53:24  profilanswer
 

tu peux tester avec IsWindow() avant d'appeler destroy. quand tu dis surcharger, tu overrides ou overloades ? l'implémentation par défaut de onClose n'appelle pas DestroyWindow() ?

n°82704
El_gringo
Posté le 19-12-2001 à 08:58:12  profilanswer
 

Alors...
IsWindow, ça résoudra pas mon pb.
Je sais pas moi, si j'override ou si j'overload, c quoi la différence. Disons que ma classe hérite de CDialog. j'ai redéfini sa méthode OnClose, c ça que j'appel surcharger.
Et l'implémentation par défaut de OnClose à pas l'air d'appeler DestroyWindow, puisque elle ne met pas à NULL le hWnd du CWnd auquel j'applique le OnClose.
Quand j'exécute en débug, à la fin de l'execution, g ça dans l'output de VC++:
 
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {614} normal block at 0x01426950, 87 bytes long.
 Data: <        J   2552> 01 00 00 00 12 00 00 00 4A 00 00 00 32 35 35 32  
strcore.cpp(118) : {613} normal block at 0x01424080, 37 bytes long.
 Data: <            Cr  > 01 00 00 00 18 00 00 00 18 00 00 00 43 72 E9 E9  
strcore.cpp(118) : {611} normal block at 0x014240E0, 68 bytes long.
 Data: <        7   Tail> 01 00 00 00 19 00 00 00 37 00  
......

n°82707
youdontcar​e
Posté le 19-12-2001 à 09:19:14  profilanswer
 

override = tu remplaces le code de la méthode par le tien
overload = tu rajoutes du code en plus de la méthode parent
 
class A
{
  virtual void myMethod();
};
 
class B : public A
{
  virtual void myMethod();
};
 
un override c'est :  
 
void B::myMethod()
{
  // le code de la méthode ...
}
 
un overload c'est :
 
void B::myMethod()
{
  // le code de la méthode ...
  // + l'appel à la méthode de la classe de base
  A::myMethod();
}  
 
je sais pas de quoi tu dérives, mais la classe de base appelle sûrement la windowproc.  
 
...
 
ce que tu vois dans l'output de visual en debug, ça s'appelle des memory leaks, et c'est trèèèèèèèèèèèèèèèèèèèès mal. c'est de la mémoire non libérée, donc ne t'étonne pas si ton programme ne marche pas correctement. f4 pour voir d'où ça vient.

n°82708
El_gringo
Posté le 19-12-2001 à 09:22:34  profilanswer
 

ce que je fais, c donc un overload (j'appel le OnClose de CDialog dans ma surchage de OnClose)...
F4 !? sous VC++ 6.0 ? à quel moment je fais F4 ? et ça va m'afficher quoi ?

n°82710
El_gringo
Posté le 19-12-2001 à 09:24:51  profilanswer
 

si je fais F4 au moment ou y m'affiche ça (qd je ferme mon appli), y me dit que le fichier strcore n'existe pas (ou plus)...

n°82711
youdontcar​e
Posté le 19-12-2001 à 09:29:14  profilanswer
 

f4 à la sortie, il ouvre le fichier correspondant à la bonne ligne ou se passe le memory leak.
 
si ça ne marche pas, essaye de gicler tous les fichiers temporaires et de faire un rebuild all ...

n°82712
El_gringo
Posté le 19-12-2001 à 09:32:33  profilanswer
 

le pb, c'est que lui me signale le débordement dans le fichier strcore.cpp. c truc là, ça fait pas partie de mon projet... donc il existe pas (ou plus qd je termine mon appli).

n°82713
El_gringo
Posté le 19-12-2001 à 09:38:54  profilanswer
 

strcore.cpp en fait, c un fichier utilisé par les MFC...

n°82727
la viper
Posté le 19-12-2001 à 10:40:47  profilanswer
 

apparement tu ne vides pas entierement la memoire alouée à ta boite de dialogue lors du OnClose. Le plantage pourrait venir de là.
 
Deux solutions :
- tu surcharges le delete de ta boite de dialogue en effacant les variables/pointeurs
- tu ne detruis pas ta boite de dialogue à chaque fois mais tu la crées une fois au demarrage et tu fais ShowWindow(SW_SHOW) / ShowWindow(SW_HIDE), pour l'afficher/la cacher
moi je m'y prend comme ca ..
 
apres ca depend de ton projet ..
 
:hello:

mood
Publicité
Posté le 19-12-2001 à 10:40:47  profilanswer
 

n°82756
El_gringo
Posté le 19-12-2001 à 11:36:49  profilanswer
 

la viper a écrit a écrit :

apparement tu ne vides pas entierement la memoire alouée à ta boite de dialogue lors du OnClose. Le plantage pourrait venir de là.
 
Deux solutions :
- tu surcharges le delete de ta boite de dialogue en effacant les variables/pointeurs
- tu ne detruis pas ta boite de dialogue à chaque fois mais tu la crées une fois au demarrage et tu fais ShowWindow(SW_SHOW) / ShowWindow(SW_HIDE), pour l'afficher/la cacher
moi je m'y prend comme ca ..
 
apres ca depend de ton projet ..
 
:hello:  




 
Pour la surcharge du delete, je l'ai pas fait parce que logiquement, ma classe en a pas besoin, parce qu'elle ne contient aucun pointeur. Et les variables n'ont pas besoin de delete normalement, si !?
Et puis de tte façon, c sur que ça n'viens pas de la destruction de l'objet, puisque l'erreur apparait alors que je ne détruit pas l'objet, seulement la boite de dialogue (voir explication du pb de base au début du topic), ce qui n'appel de toute façon pas le destructeur.
Le fait de ne pas détruire la boite de dialogue, c'est aussi ce que je fais généralement, mais là, pr certaines raisons, je préfèrerai recréer la fenêtre à chaque fois. au pire, c surement possible de se débrouiller comme ça. Mais ça me frustre... g un peu l'impression de me faire matter par mon appli ! frustrant ! :gun:

n°82772
la viper
Posté le 19-12-2001 à 12:03:52  profilanswer
 

:lol:
 
and, the winner is ...
 
ben, c'est sur que c'est un peu chelou ton truc :(
mais là pour l'instant, j'ai rien qui me vient à l'esprit .. p'etre tout à l'heure.
 
:hello:

n°82931
El_gringo
Posté le 19-12-2001 à 16:28:46  profilanswer
 

Bon, je suis désolé, mais avec les éléments que je vous ai donné, c'était impossible de trouver d'ou ça venait. Faut dire que VC brouille les piste !:D en fait, le gros pb de "memory leaks", ça venait du fait que je remplissait un CMap à l'init de ma boite, et que je la vidais pas à la destruction ! forcément, au bout d'un moment, ça déborde  :D  
par contre y me met toujours ça
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
 
qui est donc complètement autre chose que mon débordement mémoire, et qui parait pas gènant.
Merci, et désolé de vous avoir fait réfléchir pour rien (quoi qu'on réfléchi jammais pour rien en fait !:D)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++/MFC] pb avec la méthode DestroyWindow( )

 

Sujets relatifs
[C++/MFC] pb sur fermeture d'une boite non modale[MFC] Taille des .exe...
[PHP] Quelle méthode utiliser pour un espace membres?[C++/MFC] CDC --> J'arrive pas à changer la couleur de fond
[C++/MFC] les DC (ou CDC) : les Direct Context m'emmerdent ![VISUAL C++ - MFC] Comment connaître le type d'un serveur FTP
[mysql++/VC++6.0/MFC] probleme de linkage !!! urgent !!!Visual C++, MFC une paintBox ?
DirectX avec les MFCMFC: Probleme !!!!
Plus de sujets relatifs à : [C++/MFC] pb avec la méthode DestroyWindow( )


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)