Bonjour,
En mode release, j'ai un plantage de l'application (1 fois sur 2) que je ne retrouve pas en mode debug (apparemment)!
J'ai tâché de me rapprocher par dichotomie au plus près de l'erreur et apparemment elle se situerait au niveau de la ligne de code en gras.
Voici le code de la fonction qui plante:
Je fournis aussi le code de la fonction InitManip():
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
24
25
26
27 bool X::TraiterEtape5() { bool ret = false; //Affichage de la procédure ChargerFicProcedure(); //On fournit le HANDLE de la fenêtre pour l'échange de message CManipDlg *manipDlg = reinterpret_cast<CManipDlg *>(m_apDlg); manipDlg->InitManip(m_hWnd, m_Step); // TraiterEtape5_1(manipDlg); // TraiterEtape5_2(manipDlg); manipDlg->SetDlgItemText(IDC_STATIC_ETAT_OP,"Résultat de la VBF"); GetDlgItem(IDC_BUTTON_SUIV)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_GO)->ShowWindow(FALSE); m_ButtonSuiv.SetTextColor(RGB(0,150,0)); ::SetEvent(m_hEventBlink); m_nTimer = SetTimer(2, 600, NULL); ret = true; return ret; }
void CManipDlg::InitManip(HWND hWnd, UINT step)
où la classe CManipDlg, dérivée de CDialog, est chargée dynamiquement par la classe CXDlg.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 { g_hWndMain = hWnd; //variable statique -> globale à la classe g_nStep = step; //variable statique -> globale à la classe }
J'ai été aussi obligé d'utiliser des variables statiques pour la classe CManipDlg car sur l'action d'un control, mes variables n'étaient pas initialisées aux valeurs passées via la fonction InitManip();
Je pense que mon problème vient de là mais je ne sais pas comment y remédier...Il me faudrait surement récupérer correctement le handle de la fenêtre fille...
D'après le debbugger, j'ai le message suivant:
et la variable locale this à NULL(this 0x00000000 {CWnd hWnd=???} CWnd * const)Exception non gérée à 0x5f4365c6 (MFC42D.DLL) dans X.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
L'erreur se situe dans WINNOC.cpp à la ligne suivante:
ASSERT(::IsWindow(m_hWnd));
...Arf!!!
Nicolas
Partager