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

Langage Delphi Discussion :

DLL XE2 utilisée par un programme Delphi 5


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut DLL XE2 utilisée par un programme Delphi 5
    Bonjour

    J'ai créé une fois une dll avec XE2 et je l'ai utilisée à partir d'un soft écrit en D2. Ça fonctionnait très bien mais la seule fonction utilisée prenait un entier comme paramètre. Là, je fais la même chose (dll XE2 mais utilisée avec code Delphi 5) avec des paramètres de type chaînes. Mon programme de test sous XE2 fonctionne parfaitement. Le même code utilisé sous D5 provoque une violation d'accès que je n'arrive pas à comprendre. J'utilise Sharemem des 2 cotés et mes paramètres sont de type PAnsiString.

    Est-ce qu'il faut que je pense à autre chose pour que ça soit compatible ?

    Papy !
    J-L aka Papy pour les amis

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    pourquoi des PAnsiString ? tant qu'à utiliser ShareMem autant utiliser des AnsiString.

    Cependant, en matière de DLL je préfère encore utiliser des types indépendant de la gestion mémoire, PAnsiChar dans ton cas, sans ShareMem.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Ça va effectivement beaucoup mieux comme ça.

    Merci Paul
    J-L aka Papy pour les amis

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 550
    Points : 25 120
    Points
    25 120
    Par défaut
    Euh, le AnsiString D5 ne contient pas les deux 1er membre du StrRec stocké avant le Str[1]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          unsigned short codePage; // 2009+
          unsigned short elemSize; // 2009+
          int refCnt;
          int length;
    Cela pourrait peut-être fonctionner en lecture seule, mais si il y a modification, il existe un risque que la taille allouée soit mauvaise et donc VA

    Si tu utilises Sharemem\BORLNDMM.DLL en D5 et XE2, est-ce que cela prive XE2 de son nouveau gestionnaire de mémoire (100 fois plus rapide que celui de D5 ?)

    Comme Paul Toth, je préfère aussi me passer de ShareMem !
    le type BSTR géré par des WideString évite pas mal de soucis aussi, on peut allouer d'un côté et libérer de l'autre contrairement avec GetMem sur du PAnsiChar
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Je ne fais aucune modification. La DLL récupère des informations pour envoyer un email (Expéditeur, Sujet, Corps, etc.). Les infos sont ensuite juste utilisées pour renseigner les propriétés du composant Ip*Works d'envoi de mail.
    J-L aka Papy pour les amis

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 550
    Points : 25 120
    Points
    25 120
    Par défaut
    Tente d'ajouter const à tes paramètres de DLL si ce n'est pas déjà fait !
    si cela fonctionne, cela ne laissera pas d’ambiguïté sur l'utilisation des chaines
    si cela ne fonctionne pas (vu que c'est proche des PAnsiString), oublie le mot clé mais ajoute un petit commentaire !

    D'ailleurs, si pur lecture seule, même pas besoin de ShareMem avec des AnsiString : DLL String Pourquoi ça marche sans BORLNDMM.DLL
    C'est moche comme technique comme le soulignait déjà Paul Toth et c'est en plus très instructif

    Ou même des ShortString cela évite ShareMem et le déploiement de BORLNDMM.DLL
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Je viens de parcourir la discussion que tu as indiquée dans ta réponse. Très intéressant. A tout hasard, et même si c'est un peu tard, voici un extrait de l'aide de Delphi XE3:

    System.SysUtils.StrPLCopy

    Delphi

    function StrPLCopy(Dest: PAnsiChar; const Source: AnsiString; MaxLen: Cardinal): PAnsiChar;
    function StrPLCopy(Dest: PWideChar; const Source: UnicodeString; MaxLen: Cardinal): PWideChar;
    Ceci pour ton ancienne question sur les widestring

    Sinon, pour passer à ma dll la liste des destinataires de l'email, j'utilisais un paramètre de type array of PAnsiChar mais j'ai l'impression que ça a mis un peu le bazar (en tous cas, ma gestion sans doute un peu foireuse, je l'avoue). Du coup, j'ai remplacé par un PAnsiChar qui représente les adresses séparées par des virgules et je redécoupe ça dans ma dll.

    Le tableau dynamique de PAnsiChar était-il une bonne solution à ton avis ?

    Je suis passé de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure EnvoyerEmail(
      Expediteur,
      Sujet,
      Corps            : PAnsiChar;
      Destinataires : array of PAnsiChar;
      Fichiers         : array of PAnsiChar;
      Port              : Integer;
      ServeurMail,
      Utilisateur,
      MotDePasse    : PAnsiChar); stdcall;
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure EnvoyerEmail(
      Expediteur,
      Sujet,
      Corps         : PAnsiChar;
      Destinataires : PAnsiChar;
      Fichiers      : PAnsiChar;
      Port          : Integer;
      ServeurMail,
      Utilisateur,
      MotDePasse    : PAnsiChar); stdcall;
    J-L aka Papy pour les amis

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 550
    Points : 25 120
    Points
    25 120
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je viens de parcourir la discussion que tu as indiquée dans ta réponse. Très intéressant. A tout hasard, et même si c'est un peu tard, voici un extrait de l'aide de Delphi XE3:

    Ceci pour ton ancienne question sur les widestring
    Surtout que c'était en D7 !
    Avec le passage Unicode de la VCL, tout ces petites choses qui manquaient existent aujourd'hui !

    Citation Envoyé par Papy214 Voir le message
    array of PAnsiChar
    Est-ce que le type array n'a pas changé non plus entre D7 et XE3 !

    La technique Microsoft serait un d'utiliser un PCZZTSTR qui est un simple PAnsiChar ou PWideChar mais avec Un Zéro pour fin de chaine, Double Zéro pour fin de tableau, c'est connu dans ShFileOperation

    Ansi : MaChaine1#0MaChaine2#0MaDerniereChaine#0#0
    Wide : MaChaine1#0#0MaChaine2#0#0MaDerniereChaine#0#0#0#0
    #0 indique la précense d'un zéro dans le tableau

    Mais pour ton cas orienté mail, on peut faire plus simple

    Corps - tout le message
    Destinataires - suffit de séparer par ; selon la norme des mails sinon pareil que fichiers
    Fichiers - suffit de séparer par #13#10 et d'utiliser une TStringList
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Je n'ai pas eu l'idée du TStringList, pendant peut-être à tort que ça ne serait pas compatible avec d'autres langages.

    Merci pour toutes ces infos.
    J-L aka Papy pour les amis

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je n'ai pas eu l'idée du TStringList, pendant peut-être à tort que ça ne serait pas compatible avec d'autres langages.

    Merci pour toutes ces infos.
    non entre D5 et XE2 tu renonces à tout ça de toute façon, je n'avais pas pensé à la page de code des AnsiString de XE2 pointées par Shai

    il te reste deux solutions : le structures simples et les Interfaces

    1) les structures simples; si tu veux envoyer un tableau de PAnsiChar tu envoie l'adresse du premier élément ( un PPAnsiChar ) et le nombre d'éléments dans le tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure test(p: PPAnsiChar; n: Integer);
    var
      i: Integer;
      s: string;
    begin
      for i := 0 to n - 1 do
      begin
        s := p^; // premier élément
        Inc(p); // élément suivant
      end;
    end;
    avec XE2 tu peux même utiliser {$POINTERMATH ON} pour écrire p[x]

    2) les interfaces

    ça te permet de manipuler des objets de façon transparente quelque soit le langage utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type
      EMail = interface
        function Destinataires: Integer; // nombre de destinataire
        function Destinataire(Index: Integer): PAnsiChar; // un des destinataires
      end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    2) les interfaces

    ça te permet de manipuler des objets de façon transparente quelque soit le langage utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type
      EMail = interface
        function Destinataires: Integer; // nombre de destinataire
        function Destinataire(Index: Integer): PAnsiChar; // un des destinataires
      end;
    Tu veux dire que je définis mon paramètre en tant qu'en interface ? Est-ce que tu aurais un exemple tout simple avec un seul paramètre défini ainsi ?
    J-L aka Papy pour les amis

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 550
    Points : 25 120
    Points
    25 120
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je n'ai pas eu l'idée du TStringList, pendant peut-être à tort que ça ne serait pas compatible avec d'autres langages.
    La TStringList est INTERNE la DLL juste pour faciliter le découpage #13#10
    Le Paramètre reste un PAnsiChar, d'ailleurs ExtractStrings serait parfaite dans ce cas pour découper un PAnsiChar en tableau
    Faudrait vérifier si ExtractStrings existe aussi bien en PAnsiChar qu'en PWideChar

    Si tu veux que cela soit compatible, un séparateur c'est du basique suffit de bien documenter son API

    Sinon, j'avais aussi penser proposer la PPAnsiChar, mais comme en Delphi l'appel n'est pas si évident que cela, je ne l'ai pas évoqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pp : Array of PAnsiChar;
    SetLength(pp, 3);
    pp[0] := PAnsiChar(MaAnsiStringUn);
    pp[1] := PAnsiChar(MaAnsiStringDeux);
    pp[2] := PAnsiChar(MaAnsiStringTrois);
    test(@pp[0], 3); // important le @[0] cela renvoie l'adresse du premier élément
    Pour les interface autant passer en BSTR avec des WideString interne !
    Je pratique cela aussi souvent

    Ma DLL contient qu'une fonction qui est une Factory qui m'envoi mes Delphi interfaces (guid support et tout ce qui va avec) le tout codé en C++Builder comme ICI ou LA

    C'est ni plus ni moins le principe du COM mais devoir installer la DLL

    l'interface est dans fichier ISOLE partagé par la DLL et l'EXE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      EMail = interface
        function Destinataires: Integer; // nombre de destinataire
        function Destinataire(Index: Integer): PAnsiChar; // un des destinataires
      end;
     
    function CreateEmail(): EMail; // LoadLibrary + GetProcAddress ... de CreateEmail dans la DLL
    Dans la DLL, tu as ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      EMailImpl = class(TInterfacedObject, EMail)
        function Destinataires: Integer; // nombre de destinataire
        function Destinataire(Index: Integer): PAnsiChar; // un des destinataires
      end;
     
    function CreateEmail(): EMail; // Result := EMailImpl.Create();
    La libération de EMail sera automatique si tu affecte nil ou si la variable n'est plus utilisée
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Tu veux dire que je définis mon paramètre en tant qu'en interface ? Est-ce que tu aurais un exemple tout simple avec un seul paramètre défini ainsi ?
    je te recommande la lecture du chapitre 19 (disponible ici) de mon livre sur Delphi 7

    oups, le fichier n'est plus en ligne mais comme rien ne se perd sur Internet, on le trouve ici
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    J'ai déjà le pdf et je l'avais lu. J'aurais bien voulu avoir le code source d'exemple pour le système de plugin mais ça, ça doit pas etre téléchargeable
    J-L aka Papy pour les amis

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai déjà le pdf et je l'avais lu. J'aurais bien voulu avoir le code source d'exemple pour le système de plugin mais ça, ça doit pas etre téléchargeable
    le livre n'est plus édité et le code date de Delphi 7...le voici donc
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Merci Paul. Je vais étudier tout ça.
    J-L aka Papy pour les amis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mesure des ressources utilisées par un programme
    Par sunmat dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 27/10/2008, 12h32
  2. Liste des ressources utilisées par un programme
    Par QAYS dans le forum Windows XP
    Réponses: 1
    Dernier message: 03/05/2007, 20h40
  3. Trouver le nombre de handle utiliser par un programme
    Par chuckboy dans le forum Windows
    Réponses: 1
    Dernier message: 19/12/2005, 23h38
  4. Lister les classes utilisées par un programme
    Par seawolfm dans le forum Général Java
    Réponses: 3
    Dernier message: 11/10/2005, 13h18
  5. Dll en c++ dans un programme delphi
    Par wikers dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2005, 15h39

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