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

Visual C++ Discussion :

ActiveX VLC / Win32


Sujet :

Visual C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut ActiveX VLC / Win32
    J'espere que je post dans le bon thread...
    Voila, j'essaie d'encapsuler l'activeX VLC dans une appli win32.
    J'ai généré mon fichier .idl puis mon .h à partie de axvlc.dll, j'ai écris un bout de code, le meme que pour utiliser l'activeX de Flash Macromédia Player, mais lorsque je compil, il me sort deux petites erreurs...

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef HRESULT (WINAPI *PAttachControl)(IUnknown*,HWND,IUnknown**);	
    HINSTANCE hDLL2 = LoadLibrary(TEXT("atl.dll"));	
    if (!hDLL2) return 1;	
    PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL2, "AtlAxAttachControl");
    CoInitialize(0);	
    void* pIwb;
    VLCPlugin*  pIswf;
    HRESULT res=CoCreateInstance(CLSID_VLCPlugin,0,CLSCTX_ALL,IID_IVLCControl,(void**)&pIwb);
    res =AtlAxAttachControl((IUnknown *)pIswf,hWnd,NULL);

    et les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MainFrame.obj : error LNK2001: symbole externe non résolu _CLSID_VLCPlugin
    MainFrame.obj : error LNK2001: symbole externe non résolu _IID_IVLCControl
    J'ai jamais trop joué avec les activeX... si vous aviez une piste

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    L'un des fichier sources de ton projet doit inclure <initguid.h> avant d'inclure le fichier d'en-tête généré.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    J'ai essayé de position l'include à plusieurs endrois. J'obtiend soit la meme erreur soit celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h(365) : error C2065: 'GUID_NULL' : identificateur non déclaré
    c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlbase.h(2782) : error C2065: 'CLSID_StdGlobalInterfaceTable' : identificateur non déclaré

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, pour commencer... Tu utilises ATL ?
    Si non, c'est vraiment bizarre.
    Si oui, je ne peux pas t'aider non plus, je ne connais pas ATL.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Citation Envoyé par Médinoc
    Euh, pour commencer... Tu utilises ATL ?
    Si non, c'est vraiment bizarre.
    Si oui, je ne peux pas t'aider non plus, je ne connais pas ATL.
    je pense que oui... ok merci pour ton aide en tout cas

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    ok finalement, en modifiant mes includes, j'ai réussi à faire fonctionner l'active X

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    re-bonjour

    voila, j'ai parlé un peu vite. en réalité, j'arrive bien à passer outre mes problemes de compilation. Une fois que l'application est lancée, j'ai ma fenetre, dans laquelle s'affiche l'active X, on voit le logo VLC (plot de travaux)...
    Une erreur lors de l'exécution survient dès que j'appele une fonction de l'active X :
    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
    mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);	
    hr = CoCreateInstance(CLSID_VLCPlugin, NULL, CLSCTX_ALL, IID_IVLCControl, reinterpret_cast<void**>(&m_pVlc));
    typedef HRESULT (WINAPI *PFonc)(IUnknown*,HWND,IUnknown**);
    HINSTANCE hDLL = LoadLibrary(TEXT("atl.dll"));
    PFonc AtlAxAttachControl = (PFonc) GetProcAddress(hDLL,"AtlAxAttachControl");
    AtlAxAttachControl(m_pVlc,hWndParent,0);
    std::string test("C:\\video.mpg");
    BSTR sURL = SysAllocString(A2BSTR(url.c_str()));
    //m_pVlc->put_MRL(sURL); // erreur ici		
    m_pVlc->fullscreen(); // ou encore ici
    SysFreeString(sURL);
    J'ai fait deux ou trois recherches pour "comprendre" l'erreur, mais je ne voix pas d'ou sa vient.
    Si vous avez une piste
    Merci

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Est-ce que tu fais d'autres GetProcAddress() quelque part ?
    Ce genre d'erreur est généralement dû à un cast de pointeur de fonction...
    (même si celui-ci a l'air valide).

    PS: Vérifie toujours le résultat de GetProcAddress()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Citation Envoyé par Médinoc
    Est-ce que tu fais d'autres GetProcAddress() quelque part ?
    Oui, pour l'activeX Flash.
    Citation Envoyé par Médinoc
    PS: Vérifie toujours le résultat de GetProcAddress()...
    ok. J'ai vérifié le retour, j'ai bien un valeur...

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Montre tes autres GetProcAddress(), avec les prototypes de fonctions + les typedefs associés, s'il te plait...

    + Assure-toi de ne faire aucun autre cast de pointeur de fonction à aucun autre endroit, ou poste-les aussi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    j'ai réussi à résoudre le probleme :
    1- réinstaller VLC proprement.
    2- utiliser addTarget() au lieu de put_MRL()

    Merci pour ton aide

  12. #12
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    non on n'utilise pas GetProcAdress et LoadLibrary pour une dll Active X !
    QueryInterface et CoCreateInstance sont faits pour cela.
    Sinon il suffit de déclarer #import nom de bibliothéque,VC++ va générer les fichiers correspondants
    GetProcAdress et LoadLibrary c'est pour des dll "classiques"

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Citation Envoyé par Mat.M
    non on n'utilise pas GetProcAdress et LoadLibrary pour une dll Active X !
    QueryInterface et CoCreateInstance sont faits pour cela.
    Sinon il suffit de déclarer #import nom de bibliothéque,VC++ va générer les fichiers correspondants
    GetProcAdress et LoadLibrary c'est pour des dll "classiques"
    ok. En fait, j'avais trouvé une exemple pour l'activeX Flash avec cette méthode. Un collègue ma filé un exemple avec #import qui génère les fichiers (.h et compagnie) mais j'avais plusieurs problèmes :
    - de compilation dans un 1er temps (CLSID non défini...)
    - puis d'exécution, avec un pointeur null dans la tuyauterie ATL.

    Merci pour ces infos, je vais essayer de revenir sur mon code pour mettre les choses aux clair. (c'est mes 1ère pas en C++/activeX)

    Merci

  14. #14
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Ok mais pour info les objets COM n'exposent en général toujours que 4 méthodes ( dllRegister,dllUnregister,...) à moins de spécifier explicitement d'exporter une fonction...

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Bonjour

    Je me bat encore avec mes activeX

    J'ai suivi vos conseils et celui de mes collègues. Je fais donc un import de la dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #import "axvlc.dll" raw_dispinterfaces named_guids
    #include "axvlc_idl.h"
    et j'instancie le bazarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HRESULT hr;
    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);	
    hr = CoCreateInstance(CLSID_VLCPlugin, NULL, CLSCTX_ALL, IID_IVLCControl, reinterpret_cast<void**>(&m_pVlc));
    AtlAxAttachControl(m_pVlc,hWndParent,0);
    Tout compile mais à l'exécution, j'ai un erreur :
    Exception non gérée à 0x00488a9a dans BimoDemo.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
    et le débugger m'envoie ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <class contained>
    class CComPolyObject :
    	public IUnknown,
    	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
    {
    public:
    	typedef contained _BaseClass;
    	CComPolyObject(void* pv) : m_contained(pv ? pv : this)
    	{
    		_pAtlModule->Lock(); // <<<< ici 
    	}
    ...
    J'ai fait une petit recherche, j'ai compris qu'il y avais un probleme d'interblocage... ce qui est marrant, c'est que si je remet mon code "pas terrible" (voir plus haut), je n'ai pas d'erreur lors de l'execution, mais un interblocage sur cette fonction...

    Si vous avez une piste.

    Merci

  16. #16
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    eheh j'avance petit à petit... j'ai laissé mon bout de code pour faire autre chose, mais je reviens dessus.

    j'ai résolu mon problème précédent, il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ... je sais pas si c'est "bien" mais sa résoud mes problèmes.

    Entre temps, j'ai commencé à faire un wrapper pour Flash. Je récupère les événement de l'OCX. mais j'ai systematique un erreur avant l'appel et après l'appel de mon évenement.
    voici l'erreur :
    Debug Assertion Failed!
    Program: ...
    File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h
    Line: 4211
    Expression: ((HRESULT)(hr) >= 0)
    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.
    et voici comment je récupere mes événements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __declspec(selectany)_ATL_FUNC_INFO OnReadyStateChange={CC_STDCALL,VT_EMPTY,1,(VT_I4)};
    __declspec(selectany)_ATL_FUNC_INFO OnProgress={CC_STDCALL,VT_EMPTY,1,(VT_I4)};
    __declspec(selectany)_ATL_FUNC_INFO FSCommand={CC_STDCALL,VT_EMPTY,2,(VT_BSTR,VT_BSTR)};
    __declspec(selectany)_ATL_FUNC_INFO FlashCall={CC_STDCALL,VT_EMPTY,1,(VT_BSTR)};
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN_SINK_MAP(FlashWrapper)
    		SINK_ENTRY_INFO(1, DIID__IShockwaveFlashEvents, 0xfffffd9f, EventOnReadyStat, &OnReadyStateChange)
    		SINK_ENTRY_INFO(1, DIID__IShockwaveFlashEvents, 0x000007a6, EvenetOnProgress, &OnProgress)
    		SINK_ENTRY_INFO(1, DIID__IShockwaveFlashEvents, 0x00000096, EventOnFSCommand, &FSCommand)
    		SINK_ENTRY_INFO(1, DIID__IShockwaveFlashEvents, 0x000000c5, EventOnFlashCall, &FlashCall)
    	END_SINK_MAP()
    si vous avez une piste
    Merci

    EDIT : à priori c'est dans le coin...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HRESULT hr = DispCallFunc(
    			&thunk,
    			0,
    			info.cc,
    			info.vtReturn,
    			info.nParams,
    			info.pVarTypes,
    			pVarArgs,
    			pvarResult);		
    		ATLASSERT(SUCCEEDED(hr));
    		return hr;

  17. #17
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Ok j'avais oublié de mettre les arguments dans la signature de mes fonctions. Cependant il me sort encore cette erreur sur l'évenement qui nécessite 2 arguments, des BSTR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(selectany)_ATL_FUNC_INFO FSCommand={CC_STDCALL,VT_EMPTY,2,(VT_BSTR,VT_BSTR)};
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void __stdcall  EventOnFSCommand(BSTR var, BSTR value){
    		OutputDebugString(TEXT("\nEventOnFSCommand\n"));
    	}

  18. #18
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    ok. je suis allez jeter un oeil dans les tuyaux atl... Le problème se situe dans le fonction
    InvokeFromFuncInfo
    ligne 4168. Le problème apparait uniquement si je fais appel à l'evenement FSCommand de flash, qui prend en argument deux BSTR. (d'apres le .idl de l'ocx)
    Bref, j'ai mis un point d'arret dans cette fonction, les infos provenant de flash apparaissent clairement. (une clé, et une valeur)
    C'est lors de l'appel de
    DispCallFunc
    que le résultat est mauvais :
    Appel incorrect
    ligne 4202.
    Il me semble pourtant que tout les paramètres de cette fonction sont correcte. Aucun pointeur null, le nb d'argument correcte...
    J'ai vérifié plusieurs fois la déclaration des mes macros, des arguments des événements...

    Vos conseils sont les bienvenu

  19. #19
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    wouaa c'est le jeu du question/reponse...
    en fait il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(selectany)_ATL_FUNC_INFO FSCommand={CC_STDCALL,VT_EMPTY,2,(VT_BSTR,VT_BYREF)};
    mais bien laisser deux BSTR dans la signature de la fonction...

    Enjoy :d

Discussions similaires

  1. Utilisation de l'ActiveX vlc pour freeplayer
    Par bolandfranck dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 13/05/2008, 13h15
  2. Composant ActiveX VLC : récupérer une image
    Par kimlee dans le forum Composants VCL
    Réponses: 1
    Dernier message: 10/01/2008, 17h28
  3. utilisation activex vlc
    Par gentelmand dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/11/2007, 00h31
  4. [Débutant] ActiveX et Win32
    Par punx120 dans le forum MFC
    Réponses: 4
    Dernier message: 28/06/2006, 12h29
  5. ActiveX VLC (Video Lan Client) dans delphi
    Par Annaced dans le forum Composants VCL
    Réponses: 8
    Dernier message: 02/04/2006, 04h35

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