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 :

MFC liées statiquement fonctionnent en DEBUG, pas en RELEASE


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut MFC liées statiquement fonctionnent en DEBUG, pas en RELEASE
    Bonjour,

    Mon application utilise les DLL MFC liées statiquement.

    En debug, cela fonctionne bien. En release cela plante...

    Au moment de l'Initinstance j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	CCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
    	if (!ProcessShellCommand(cmdInfo))
    		return FALSE;
    Lors du passage dans la fonction ProcessShellCommand() il créé un nouveau fichier au moyen de la fonction : CDocManager::OnFileNew();
    Après plusieurs opérations, il tombe dans la fonction suivante :
    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
    50
    51
    52
    53
    54
    55
    56
    /////////////////////////////////////////////////////////////////////////////
    // CSingleDocTemplate commands
     
    CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
    	BOOL bMakeVisible)
    	// if lpszPathName == NULL => create new file of this type
    {
    	CDocument* pDocument = NULL;
    	CFrameWnd* pFrame = NULL;
    	BOOL bCreated = FALSE;      // => doc and frame created
    	BOOL bWasModified = FALSE;
     
    	if (m_pOnlyDoc != NULL)
    	{
    		// already have a document - reinit it
    		pDocument = m_pOnlyDoc;
    		if (!pDocument->SaveModified())
    			return NULL;        // leave the original one
     
    		pFrame = (CFrameWnd*)AfxGetMainWnd();
    		ASSERT(pFrame != NULL);
    		ASSERT_KINDOF(CFrameWnd, pFrame);
    		ASSERT_VALID(pFrame);
    	}
    	else
    	{
    		// create a new document
    		pDocument = CreateNewDocument();
    		ASSERT(pFrame == NULL);     // will be created below
    		bCreated = TRUE;
    	}
     
    	if (pDocument == NULL)
    	{
    		AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
    		return NULL;
    	}
    	ASSERT(pDocument == m_pOnlyDoc);
     
    	if (pFrame == NULL)
    	{
    		ASSERT(bCreated);
     
    		// create frame - set as main document frame
    		BOOL bAutoDelete = pDocument->m_bAutoDelete;
    		pDocument->m_bAutoDelete = FALSE;
    					// don't destroy if something goes wrong
    		pFrame = CreateNewFrame(pDocument, NULL);
    		pDocument->m_bAutoDelete = bAutoDelete;
    		if (pFrame == NULL)
    		{
    			AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
    			delete pDocument;       // explicit delete on error
    			return NULL;
    		}
    	}
    Et il provoque in assert sur le AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);

    En liant les MFC dynamiquement cela fonctionne bien...
    Si quelqu'un aurait une idée de la raison du plantage...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Quelle ligne ?
    Quelle erreur (le debuggeur le dit)?
    Toutes les librairies et dll sont en Release ?

    etc...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Bonjour bacelar,

    Sorry j'avais appuyé sur la mauvaise touche (entre créer et visualiser) et j'avais donc posté un message pas complet.

    Pour info, tout est en release oui.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Je signale que l'on peut faire du pas à pas sous VS, même en Release.
    Il faut juste générer les pdb.

    Donc en débuggant en mode pas à pas en Release, ça donne quoi ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Oui je suis en mode pas-à-pas en Release...

    Ben cela fait ce qui est dit au début.

  6. #6
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu utilises VC2008 ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Bonjour Farscape,

    Oui j'utilise bien VS2008. Je suis le collègue d'Alen, et l'application est dérivée des échanges que vous avez eu fin de l'année passé (migration d'une application vers le look "Office 2007").
    Pour info le code de InitInstance..

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    /////////////////////////////////////////////////////////////////////////////
    // CTASelectApp initialization
    BOOL CTASelectApp::InitInstance()
    {
    
    ...
    	// InitCommonControlsEx() est requis sur Windows*XP si le manifeste de l'application
    	// spécifie l'utilisation de ComCtl32.dll version*6 ou ultérieure pour activer les
    	// styles visuels.  Dans le cas contraire, la création de fenêtres échouera.
    	INITCOMMONCONTROLSEX InitCtrls;
    	InitCtrls.dwSize = sizeof(InitCtrls);
    	// À définir pour inclure toutes les classes de contrôles communs à utiliser
    	// dans votre application.
    	InitCtrls.dwICC = ICC_WIN95_CLASSES;
    	InitCommonControlsEx(&InitCtrls);
    
    	CWinAppEx::InitInstance();
    
    	// Initialiser les bibliothèques OLE
    	if (!AfxOleInit())
    	{
    		AfxMessageBox(IDP_OLE_INIT_FAILED);
    		return FALSE;
    	}
    
    	EnableLoadWindowPlacement(FALSE);
    
    	/////////////////////////////////////////////////////////////////////////
    	// Standard initialization
    	// If you are not using these features and wish to reduce the size
    	//  of your final executable, you should remove from the following
    	//  the specific initialization routines you do not need.
    
    	LoadStdProfileSettings(0);  // Load standard INI file options
    	InitContextMenuManager();
    	InitKeyboardManager();
    	InitTooltipManager();
    	CMFCToolTipInfo ttParams;
    	ttParams.m_bVislManagerTheme = TRUE;
    	TASApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
    		RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
    	// Inscrire les modèles de document de l'application. Ces modèles
    	//  lient les documents, fenêtres frame et vues entre eux
    	CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CTASelectDoc),
    		RUNTIME_CLASS(CMainFrame),       // fenêtre frame SDI principale
    		RUNTIME_CLASS(CTASelectView));
    	if (!pDocTemplate)
    		return FALSE;
    	AddDocTemplate(pDocTemplate);
    
    	// Enable DDE Execute open
    	EnableShellOpen();
    	RegisterShellFileTypes(TRUE);
    	
    	// Update registry with ftp parameters 
    ....
    
    	// Parse command line for standard shell commands, DDE, file open
    	CCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
    
    	// Dispatch commands specified on the command line. Retournent FALSE si
    	// l'application a été lancée avec /RegServer, /Register, /Unregserver ou /Unregister.
    	if (!ProcessShellCommand(cmdInfo))
    		return FALSE;
    Merci

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Si vous faite du pas à pas, pourquoi ne pas donner la ligne exacte ?
    Pourquoi ne pas donner les valeurs des variables utilisées par la ligne qui pose problème ?
    Pourquoi ne pas avoir les informations produites par le débuggeur ?

    Sur un code de plusieurs dizaines de ligne, cela permet de gagner beaucoup de temps.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Bonjour Bacelar,

    Comme marqué plus haut il fait un assert sur le AFX_IDP_FAILED_TO_CREATE_DOC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		pFrame = CreateNewFrame(pDocument, NULL);
    		pDocument->m_bAutoDelete = bAutoDelete;
    		if (pFrame == NULL)
    		{
    			AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
    			delete pDocument;       // explicit delete on error
    			return NULL;
    		}
    En regardant le code cela arrive parce que pFrame == NULL... la fonction CreateNewFrame ne fonctionne pas comme elle devrait.
    Si je fais du step par step dans cette fonction cela fonctionne bien jusqu'à la sortie de la fonction, à ce moment la valeur transmise est nulle alors que le return pPointer est bien initialisé...

    J'espère avoir été plus clair comme ça.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    C'est bizarre:
    le code de la méthode "CDocTemplate::CreateNewFrame" termine par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	// it worked !
    	return pFrame;
    Quelle version des MFC utilisez-vous ?

    En Release, il ne faut pas avoir une confiance aveugle dans le débuggeur.
    S'il y a des choses étranges, utilisez le code assembleur en mode pas à pas pour vérifier le contenue des "variables" et des registres.

  11. #11
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    je pense que c'est un problème de contexte,
    sur le projet qui m'a servi de départ je constate le même problème que toi en release en mode static.
    sur un autre projet, celui que j'ai réalisé pour mon dernier tuto sur les MFC le problème n'apparait pas.
    je regarde de mon coté si je trouve quelque chose expliquant cela .

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Si c'est un problème de contexte, n'y aurait-il pas une modification sur une lib pour faire passer les MFC en static qui n'a pas été répercuté en Release ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Heuuu,

    je ne sais pas

    Si oui, je ne sais pas quoi...

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pouvez-répondre à mes questions précédentes ? (version des MFC etc...)

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Les MFC 9.

    En Release, il ne faut pas avoir une confiance aveugle dans le débuggeur.
    S'il y a des choses étranges, utilisez le code assembleur en mode pas à pas pour vérifier le contenue des "variables" et des registres.
    C'est ce que j'avais cru comprendre alors je suis aussi passé en mode assembleur mais cela ne donnait pas de meilleurs résultats.

    Strange tout ça.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Etes-vous sûr de ne pas faire un mixe de version de MFC ?

    Je m'explique, je suis sur une machine n'ayant que VC2008 SP1, donc les MFC 9.0, et la fin du code de la méthode "CDocTemplate::CreateNewFrame" ne semble pas être identique à la votre.

    En suivant l'assembleur, normalement on ne peu pas perdre la valeur du pointeur de fenêtre qui est soit stocker dans un registre, soit dans la pile.
    Avec cette information, il faut analyser le code machine de l'appelant en charge de récuperer ce pointeur.
    S'il vas le chercher au mauvais endroit, il y un problème de version de MFC ou des constantes de compilations en vrac.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Je travaille sur une machine Vista (récemment formatée) avec VS2008 SP1. Je n'ai rien installé d'autre...

    Je ne pense donc pas avoir de mixe entre les MFC.

    ...

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pouvez-vous nous donner le code source de la méthode "CDocTemplate::CreateNewFrame" depuis l'affichage dans le debuggeur.
    Je n'ai pas la même fin de méthode que vous.

    j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	// it worked !
    	return pFrame;
    et non :


  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 20
    Points
    20
    Par défaut
    Voila le bout de code :

    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
    /////////////////////////////////////////////////////////////////////////////
    // Default frame creation
     
    CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)
    {
    	if (pDoc != NULL)
    		ASSERT_VALID(pDoc);
    	// create a frame wired to the specified document
     
    	ASSERT(m_nIDResource != 0); // must have a resource ID to load from
    	CCreateContext context;
    	context.m_pCurrentFrame = pOther;
    	context.m_pCurrentDoc = pDoc;
    	context.m_pNewViewClass = m_pViewClass;
    	context.m_pNewDocTemplate = this;
     
    	if (m_pFrameClass == NULL)
    	{
    		TRACE(traceAppMsg, 0, "Error: you must override CDocTemplate::CreateNewFrame.\n");
    		ASSERT(FALSE);
    		return NULL;
    	}
    	CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
    	if (pFrame == NULL)
    	{
    		TRACE(traceAppMsg, 0, "Warning: Dynamic create of frame %hs failed.\n",
    			m_pFrameClass->m_lpszClassName);
    		return NULL;
    	}
    	ASSERT_KINDOF(CFrameWnd, pFrame);
     
    	if (context.m_pNewViewClass == NULL)
    		TRACE(traceAppMsg, 0, "Warning: creating frame with no default view.\n");
     
    	// create new from resource
    	if (!pFrame->LoadFrame(m_nIDResource,
    			WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
    			NULL, &context))
    	{
    		TRACE(traceAppMsg, 0, "Warning: CDocTemplate couldn't create a frame.\n");
    		// frame will be deleted in PostNcDestroy cleanup
    		return NULL;
    	}
     
    	// it worked !
    	return pFrame;
    }
    Chez moi cela se termine aussi par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // it worked !
    	return pFrame;

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    En mode pas à pas dans le debuggeur "pFrame" n'est pas NULL sur la ligne du return ?
    Sinon, le problème vient d'une des lignes précédentes qui met cette valeur à NULL.

    Si elle n'est pas NULL, vérifiez le code assembleur de la ligne du return pour vérifier comment la valeur de retour est passée à la méthode appelante (par registre ou sur la pile).
    Une fois dans le code de la fonction appelante (après l'exécution de l'op-code ret), vérifiez où le code de la fonction appelante va chercher la valeur de retour.
    Si le code va la chercher à un autre endroit, vous avec des problèmes de configuration de compilation et d'édition de lien qui sont incohérentes entre les modules de compilations (lib, lib de dll et exécutable).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Code fonctionne en debug pas en execution
    Par LePhasme dans le forum VBA Word
    Réponses: 5
    Dernier message: 15/05/2008, 10h51
  2. [HTML] Ancre liée à formulaire fonctionne pas avec certains boutons "submit" sur ie6
    Par 12monkeys dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 28/02/2008, 21h30
  3. Fonctionne en Debug mais pas en Release
    Par Baud10 dans le forum MFC
    Réponses: 23
    Dernier message: 04/02/2008, 15h17
  4. [MFC]ModifyStyle ne fonctionne pas...
    Par Dos dans le forum MFC
    Réponses: 5
    Dernier message: 12/07/2005, 18h04
  5. Réponses: 12
    Dernier message: 15/02/2005, 15h34

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