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 :

[VC6.0] Mon appli GDI+ plante en faisant 2 bips puis quitte


Sujet :

MFC

  1. #1
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut [VC6.0] Mon appli GDI+ plante en faisant 2 bips puis quitte
    Bonjour à tous,

    J'ai développé une application sous Windows XP qui crée et affiche des pages HTML à partir de fichiers texte formattés contenant des données statistiques.
    Lors de tests sur une autre machine sous Windowns NT "allégé", j'ai un plantage bizarre : quand on affiche certaines fenêtres pour la deuxième fois, l'ordinateur émet deux bips consécutifs et l'application est quittée, sans message d'erreur.
    J'ai bien sûr vérifié de ne pas avoir laissé trainer de Beep(). Est-ce que quelqu'un a déjà eu ce genre de comportement ?

    Le plantage semble avoir lieu dans cette fonction (je dis bien semble car je ne peux pas lancer l'appli sous NT en debug) :
    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
    47
    48
    49
    // saves the graph to a PNG image
    void CGraph::saveToPNG(CString path, int width /* = 0 */, int height /* = 0 */)
    {
    	SLayout imgLayout;
    	imgLayout._is_valid = false;
     
    	if (width != 0)
    	{
    		// width/height specified
    		imgLayout._global = RectF(0, 0, (float)width, (float)height);
    	}
    	else
    	{
    		// no width specified, use the screen layout size
    		imgLayout._global = m_screen_layout._global;
    		SizeF size;
    		imgLayout._global.GetSize(&size);
    		width = (int)size.Width;
    		height = (int)size.Height;
    	}
     
    	// creates a bitmap the right size
    	Bitmap image(width, height);
     
    	// creates a Graphics object based on the image
    	Graphics g(&image);
     
    	// smooth drawing with antialias
    	g.SetSmoothingMode(SmoothingModeAntiAlias);
     
    	// fills the background
    	SolidBrush* b = new SolidBrush(m_cfg._brush_color);
    	g.FillRectangle(b, getRect(imgLayout._global));
    	delete b;
     
    	// outline uses the fill color when exporting, so no border is visible
    	Pen* p = new Pen(m_cfg._brush_color);
    	g.DrawRectangle(p, getRect(imgLayout._global));
    	delete p;
     
    	// draws everything
    	drawAll(g, imgLayout);
     
    	// saves the image.
    	CLSID pngClsid;
    	Utils::GetEncoderClsid(L"image/png", &pngClsid);
    	BSTR finalPath = path.AllocSysString();
    	image.Save(finalPath, &pngClsid, NULL);
    }

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Essaie de tracer plus précisément avec un fichier de log ou avec outputdebugstring http://c.developpez.com/faq/vc/?page...putDebugString

  3. #3
    mat.M
    Invité(e)
    Par défaut Re: [VC6.0] Mon application plante en faisant 2 bips puis qu
    Citation Envoyé par nmarf
    Lors de tests sur une autre machine sous Windowns NT "allégé", j'ai un plantage bizarre : quand on affiche certaines fenêtres pour la deuxième fois, l'ordinateur émet deux bips consécutifs et l'application est quittée, sans message d'erreur.
    La classe Graphics c'est avec quoi ?
    C'est avec GDI+ ?
    Si l'appli plante en beepant c'est qu'il ya un effet de bord , des données mal initialisées ....
    GDI + c'est avec du code machine à exceptions gérées ( "managed code") seule solution tracer comme suggère Nico-Pyright

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    GDI+ est dispo en natif aussi:
    http://msdn.microsoft.com/library/en-us/gdicpp/gdiplus/gdiplus.asp

  5. #5
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut Re: [VC6.0] Mon application plante en faisant 2 bips puis qu
    Citation Envoyé par mat.M
    La classe Graphics c'est avec quoi ?
    C'est avec GDI+ ?
    C'est une classe que j'ai récupérée de quelqu'un d'autre et il semblerait en effet qu'elle utilise GDI+ car dans l'en-tête du fichier CGraph.cpp j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using namespace Gdiplus;
    using namespace Utils;
    Citation Envoyé par mat.M
    Si l'appli plante en beepant c'est qu'il ya un effet de bord , des données mal initialisées ....
    GDI + c'est avec du code machine à exceptions gérées ( "managed code") seule solution tracer comme suggère Nico-Pyright
    Bon, et bien je vais tracer...

    Aurelien.Regat-barrel > Je ne comprends pas ton message. Que veut dire "en natif" ? (Je n'y connais pas grand chose en GDI+, à part ce que j'ai pu trouver à droite à gauche).

  6. #6
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Après avoir tracé je peux dire que le plantage survient au moment d'appeler (pour la deuxième fois) la fonction drawAll() dans la fonction saveToPng()

    extrait de la fonction saveToPng()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // outline uses the fill color when exporting, so no border is visible
    	Pen* p = new Pen(m_cfg._brush_color);
    	g.DrawRectangle(p, getRect(imgLayout._global));
    	delete p;
     
    	// draws everything
    	drawAll(g, imgLayout);		//	<----- plantage
     
    	// saves the image.
    	CLSID pngClsid;
    	Utils::GetEncoderClsid(L"image/png", &pngClsid);
    	BSTR finalPath = path.AllocSysString();
    	image.Save(finalPath, &pngClsid, NULL);
    fonction drawAll()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CGraph::drawAll(Graphics &g, SLayout &l)
    {
    	if(!l._is_valid)
    		calcLayout(g, l);
    	drawTitle(g, l._title);
    	drawLegend(g, l._legend);
    	drawGraph(g, l._graph);
    } // drawAll()
    déclaration de drawAll() dans CGraph.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      protected:
    	// affichage
    	virtual void drawAll(Gdiplus::Graphics &g, SLayout &l);
    Le plantage survient avant même l'exécution de la première ligne de drawAll().

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Et le débogueur il te donne pas l'erreur + la ligne fautive ?
    Note que ton code se simplifie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Pen* p = new Pen(m_cfg._brush_color); 
       g.DrawRectangle(p, getRect(imgLayout._global)); 
       delete p;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Pen p(m_cfg._brush_color); 
       g.DrawRectangle(&p, getRect(imgLayout._global));
    pour ma remarque, ça veut dire que tu utilises du code C++ normal et non .Net.

  8. #8
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Le problème, c'est que je n'ai aucun message d'erreur au plantage, et que je ne peux pas lancer l'appli en debug à cause de dll manquantes.

    Ou alors, je n'ai pas compris ta question.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Un débogueur, c'est un outil spécialement fait pour déboguer. Essaye de t'en servir tu gagneras du temps.
    Où sont ces dll manquantes ? Si tu les mets dans le même répertoire que ton exe / ta solution, il ne devrait pas y avoir de problèmes.

Discussions similaires

  1. xmlDocPtr plante mon appli
    Par lrgtk dans le forum C
    Réponses: 5
    Dernier message: 14/01/2010, 17h43
  2. pourquoi ma boucle fait planté mon appli ?
    Par zerros dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/05/2009, 16h21
  3. CArray RemoveAll plante mon appli
    Par damdam78 dans le forum MFC
    Réponses: 5
    Dernier message: 10/09/2008, 11h46
  4. Ressources GDI utilisées par mon appli
    Par Bobx dans le forum Delphi
    Réponses: 1
    Dernier message: 27/10/2006, 17h40
  5. delete[] plante mon appli !
    Par Dauphin dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/12/2005, 20h52

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