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 :

Erreur fin appli ds code MFC


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut Erreur fin appli ds code MFC
    Bonjour,

    J'ai une appli que j'ai créé avec Visual C++ 6 et qui tourne ss Windows 2000. Quand je quitte cette application, j'ai une erreur sur un ASSERT en mode debug. Cette erreur apparait seulement sur certains PC et je n'ai aucun problèmes sur d'autres !
    Tous ces PC ont la meme configuration car masterisé de la meme facon par le service informatique de la grande entreprise ou je bosse.
    Ce qui m'etonne, c'est que ca plante à un endroit que je ne controle pas du tout puisque c'est du code MFC qui s'exectue après le mien. Il y a quelquechose que je ne dois pas faire ou mal avant de fermé l'appli... mais je ne vois pas quoi.

    En mode debug, je plante ici :
    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
    BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
    {
    	ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));// C'est ici que ca plante
    	ASSERT(pMsg != NULL);
     
    	// walk from the target window up to the hWndStop window checking
    	//  if any window wants to translate this message
     
    	for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
    	{
    		CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
    		if (pWnd != NULL)
    		{
    			// target window is a C++ window
    			if (pWnd->PreTranslateMessage(pMsg))
    				return TRUE; // trapped by target window (eg: accelerators)
    		}
     
    		// got to hWndStop window without interest
    		if (hWnd == hWndStop)
    			break;
    	}
    	return FALSE;       // no special processing
    }
    Le pointeur hWndStop n'est pas nul, mais n'est pas une fenetre non plus...

    En remontant la pile je passe par la :
    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
    BOOL CWinThread::PreTranslateMessage(MSG* pMsg)
    {
    	ASSERT_VALID(this);
     
    	// if this is a thread-message, short-circuit this function
    	if (pMsg->hwnd == NULL && DispatchThreadMessageEx(pMsg))
    		return TRUE;
     
    	// walk from target to main window
    	CWnd* pMainWnd = AfxGetMainWnd();
    	if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg))// <--------------  ici
    		return TRUE;
     
    	// in case of modeless dialogs, last chance route through main
    	//   window's accelerator table
    	if (pMainWnd != NULL)
    	{
    		 CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd);
    		 if (pWnd->GetTopLevelParent() != pMainWnd)
    			return pMainWnd->PreTranslateMessage(pMsg);
    	}
     
    	return FALSE;   // no special processing
    }
    Puis
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    BOOL CWinThread::PumpMessage()
    {
    	ASSERT_VALID(this);
     
    	if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))
    	{
    #ifdef _DEBUG
    		if (afxTraceFlags & traceAppMsg)
    			TRACE0("CWinThread::PumpMessage - Received WM_QUIT.\n");
    		m_nDisablePumpCount++; // application must die
    			// Note: prevents calling message loop things in 'ExitInstance'
    			// will never be decremented
    #endif
    		return FALSE;
    	}
     
    #ifdef _DEBUG
    	if (m_nDisablePumpCount != 0)
    	{
    		TRACE0("Error: CWinThread::PumpMessage called when not permitted.\n");
    		ASSERT(FALSE);
    	}
    #endif
     
    #ifdef _DEBUG
    	if (afxTraceFlags & traceAppMsg)
    		_AfxTraceMsg(_T("PumpMessage"), &m_msgCur);
    #endif
     
    	// process this message
     
    	if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))// <--------------  ici
    	{
    		::TranslateMessage(&m_msgCur);
    		::DispatchMessage(&m_msgCur);
    	}
    	return TRUE;
    }
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // main running routine until thread exits
    int CWinThread::Run()
    {
    	ASSERT_VALID(this);
     
    	// for tracking the idle time state
    	BOOL bIdle = TRUE;
    	LONG lIdleCount = 0;
     
    	// acquire and dispatch messages until a WM_QUIT message is received.
    	for (;;)
    	{
    		// phase1: check to see if we can do idle work
    		while (bIdle &&
    			!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
    		{
    			// call OnIdle while in bIdle state
    			if (!OnIdle(lIdleCount++))
    				bIdle = FALSE; // assume "no idle" state
    		}
     
    		// phase2: pump messages while available
    		do
    		{
    			// pump message, but quit on WM_QUIT
    			if (!PumpMessage())// <--------------  ici
    				return ExitInstance();
     
    			// reset "no idle" state after pumping "normal" message
    			if (IsIdleMessage(&m_msgCur))
    			{
    				bIdle = TRUE;
    				lIdleCount = 0;
    			}
     
    		} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
    	}
     
    	ASSERT(FALSE);  // not reachable
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Main running routine until application exits
    int CWinApp::Run()
    {
    	if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
    	{
    		// Not launched /Embedding or /Automation, but has no main window!
    		TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
    		AfxPostQuitMessage(0);
    	}
    	return CWinThread::Run();// <--------------  ici
    }
    Et enfin :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	LPTSTR lpCmdLine, int nCmdShow)
    {
    	ASSERT(hPrevInstance == NULL);
     
    	int nReturnCode = -1;
    	CWinThread* pThread = AfxGetThread();
    	CWinApp* pApp = AfxGetApp();
     
    	// AFX internal initialization
    	if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
    		goto InitFailure;
     
    	// App global initializations (rare)
    	if (pApp != NULL && !pApp->InitApplication())
    		goto InitFailure;
     
    	// Perform specific initializations
    	if (!pThread->InitInstance())
    	{
    		if (pThread->m_pMainWnd != NULL)
    		{
    			TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
    			pThread->m_pMainWnd->DestroyWindow();
    		}
    		nReturnCode = pThread->ExitInstance();
    		goto InitFailure;
    	}
    	nReturnCode = pThread->Run();// <--------------  ici
     
    InitFailure:
    #ifdef _DEBUG
    	// Check for missing AfxLockTempMap calls
    	if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
    	{
    		TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
    			AfxGetModuleThreadState()->m_nTempMapLock);
    	}
    	AfxLockTempMaps();
    	AfxUnlockTempMaps(-1);
    #endif
     
    	AfxWinTerm();
    	return nReturnCode;
    }
    Je vois pas trop ce que ca fait tt ce code, ni pourquoi au final ca plante.
    Si quelqu'un a une idée ou une piste, je suis preneur.
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    difficile de répondre comme ça , tu utilises des threads ? , des traitements dans des boucles ?
    ça me fait penser à ca: le programme se ferme et un traitement dans une fenêtre ne peut pas sortir , le programme plante parce que son environnement se détruit ..
    c'est juste une suggestion ..

Discussions similaires

  1. Migrations de codes MFC de Visual 6.0 vers Visual studio 2005
    Par jojo le boss dans le forum VC++ .NET
    Réponses: 12
    Dernier message: 06/08/2006, 11h47
  2. [VBA] erreur au niveau du code
    Par torNAdE dans le forum Access
    Réponses: 9
    Dernier message: 26/07/2006, 14h33
  3. Erreur: Fin de fichier inattendue.
    Par Berzerk_ dans le forum C++
    Réponses: 22
    Dernier message: 01/06/2006, 17h07
  4. [IE]Erreur javascript sur un code de 2 lignes...
    Par narnou dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/05/2006, 17h20
  5. [Servlet][Compilation] Erreur de compil dans code servlet
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/05/2004, 10h17

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