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

 Delphi Discussion :

Récupérer La Marque et le Modèle de l’écran


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut Récupérer La Marque et le Modèle de l’écran
    Bonsoir a tous

    je suis entrain d'essayer d'obtenir la marque et le modèle de l’écran pour faire un inventaire avec mon application

    j'essaie avec le WMI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D:=GetWMIstring('Win32_DesktopMonitor','MonitorType');
    E:=GetWMIstring('Win32_DesktopMonitor','MonitorManufacturer');
    mais je n'ai toujours pas la marque et le modèle exacte il me retourne toujours :

    Moniteur Plug-and-Play générique

    (Types d’écrans standard)

    je ne sais pas pourquoi malgré que j'ai changer d'écran et de pc il me donne pas par exemple la marque HP et le modèle LE17...etc

    Merci de votre aide

    j'utilise comme vous voyez : Win32_DesktopMonitor

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    tu peut essayer de trouver dans ce project
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
     
    library pro001;
     
    { Remarque importante concernant la gestion de mémoire de DLL : ShareMem doit
      être la première unité de la clause USES de votre bibliothèque ET de votre projet
      (sélectionnez Projet-Voir source) si votre DLL exporte des procédures ou des
      fonctions qui passent des chaînes en tant que paramètres ou résultats de fonction.
      Cela s'applique à toutes les chaînes passées de et vers votre DLL --même celles
      qui sont imbriquées dans des enregistrements et classes. ShareMem est l'unité
      d'interface pour le gestionnaire de mémoire partagée BORLNDMM.DLL, qui doit
      être déployé avec vos DLL. Pour éviter d'utiliser BORLNDMM.DLL, passez les
      informations de chaînes avec des paramètres PChar ou ShortString. }
     
    uses
      SysUtils,inifiles,strutils, dialogs,
      Classes,
      pro001u in 'pro001u.pas';
     
    type TMedia = record
      DriveType : integer;
      MediaType : Integer;
      MediaTypeString : String;
      Interfacetype : String;
      Caption : String;
      FreeSpace : Cardinal;
     
    end;
    IEnumVariant = interface(IUnknown)
        ['{00020404-0000-0000-C000-000000000046}']
        function Next(celt: LongWord; var rgvar : OleVariant;
          out pceltFetched: LongWord): HResult; stdcall;
        function Skip(celt: LongWord): HResult; stdcall;
        function Reset: HResult; stdcall;
        function Clone(out Enum: IEnumVariant): HResult; stdcall;
      end;
     
    // Constantes WMI
    const
      STR_LOCALHOST = '.';
      STR_CIM2_ROOT = 'root\cimv2';
      STR_CLASS     = 'Win32_DISKDRIVE';
    // Autres
    const
      STR_EMPTY = '';
     
    // WMI ------------------------------------------------------------------------
    // ces fonctions sont faites dans le but de pouvoir traiter toutes les informations WMI
    // pas seulement ,comme c'est mon but ici , obtenir des informations disque
    function WMIGet(SQL : String) : WideString;
    var
       Locator:ISWbemLocator;
       Services:ISWbemServices;
       ObjSet:ISWbemObjectSet;
       Value:Cardinal;
       SObject:ISWbemObject;
       TempObj : OleVariant;
       Enum :IEnumVariant;
    begin
      try
        Locator := CoSWbemLocator.Create();
        // Connection au service WMI
        Services := Locator.ConnectServer(
            STR_LOCALHOST,        {local}
            STR_CIM2_ROOT,        {root}
            STR_EMPTY, STR_EMPTY, {Utilisateur et Mot de passe -en local inutile-}
            STR_EMPTY,STR_EMPTY, 0, nil);
        // Acceder aux données
        ObjSet := Services.ExecQuery(SQL,'WQL',
                                    wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
        Enum :=  (ObjSet._NewEnum) as IEnumVariant;
         // un objet trouvé ?
        if (Enum.Next(1, TempObj, Value) = S_OK)
           then begin
             SObject :=IUnknown(TempObj) as ISWBemObject;
            if (SObject <> nil) then
               begin
                 // Acceder aux propriétés
                 // SObject.Properties_;
                 result:=SObject.GetObjectText_(0);
               end;
           end;
      except
        Result:='';
      end;
    end;
     
    function WMICollection(Chaine : WideString;out THS :THashedStringList): Integer;
    var d,f : word;
        start : Boolean;
        Ws : String;
    begin
        Chaine:=AnsiReplaceStr(Chaine,';','');
        Chaine:=AnsiReplaceStr(Chaine,' = ','=');
        Chaine:=AnsiReplaceStr(Chaine,#9,'');
        Ws:='';
        for f := Length(Chaine) downto 0 do
          if chaine[f]='}' then break;
        Start:=False;
        for d:= 0 to f-1 do
          begin
           if Start then ws:=ws+Chaine[d]
                    else Start:=Chaine[d]='{';
          end;
        THS.Text:=ws;
        Result:=THS.Count;
    end;
     
    function WMISubCollection(Chaine : String;out  TS : TStrings):Integer;
    var d,f : word;
        start : Boolean;
        Ws : String;
    begin
        ws:='';
        for f := Length(Chaine) downto 0 do
          if chaine[f]='}' then break;
        start:=False;
        for d:= 0 to f-1 do
         begin
          if Start then ws:=ws+Chaine[d]
                   else Start:=Chaine[d]='{';
         end;
         TS.CommaText:=ws;
         Result:=TS.Count;
    end;
     
    function WMIPropriete(WMIGot : WideString ;Name : String) : String;
    var TS : THashedStringList;
    begin
     TS:=THashedStringList.Create;
     try
     WMICollection(WMIGot,TS);
     Result:=AnsiReplaceStr(TS.ValueFromIndex[TS.IndexOfName(Name)],'"','');
     finally
       FreeAndNil(TS);
     end;
    end;
     
    function WMIProprieteInt(WMIGot: WideString; Name : String): LongInt;
    var TS : THashedStringList;
        R : String;
    begin
     TS:=THashedStringList.Create;
     try
     WMICollection(WMIGot,TS);
     R:=AnsiReplaceStr(Trim(TS.ValueFromIndex[TS.IndexOfName(Name)]),'"','');
     try Result:=StrToInt(R); except Result:=-1; end;
     finally
       FreeAndNil(TS);
     end;
    end;
     
    function GetPhysicalDrive(Drive : String) : String;
    var
       Locator:ISWbemLocator;
       Services:ISWbemServices;
       ObjSet:ISWbemObjectSet;
       Value:Cardinal;
       partition : String;
     
       function DeviceIDFromAssoc(ObjectSet : ISWbemObjectSet): String;
        var SObject:ISWbemObject;
            TempObj : OleVariant;
            Enum :IEnumVariant;
            TS:TStringList;
        begin
         // Obtenir DeviceID de Antécédent
         Enum :=  (ObjSet._NewEnum) as IEnumVariant;
         // un objet trouvé ?
         if (Enum.Next(1, TempObj, Value) = S_OK) then begin
          SObject := IUnknown(TempObj) as ISWBemObject;
          if (SObject <> nil) then begin
            // Acceder aux propriétés
            SObject.Properties_;
            TS := TStringList.Create();
            try
              TS.Text:=AnsiReplaceStr(WMIPropriete(SObject.GetObjectText_(0),'Antecedent'),'"','');
              Result:=Copy(TS.ValueFromIndex[0],2,Length(TS.ValueFromIndex[0])-2);
            finally
              FreeAndNil(TS);
            end;
          end;
          end;
        end;
     
    begin
       try
        Locator := CoSWbemLocator.Create();
        // Connection au service WMI
        Services := Locator.ConnectServer(
            STR_LOCALHOST,        {local}
            STR_CIM2_ROOT,        {root}
            STR_EMPTY, STR_EMPTY, {Utilisateur et Mot de passe -en local inutile-}
            STR_EMPTY,STR_EMPTY, 0, nil);
        // Acceder aux données
       ObjSet := Services.ExecQuery('REFERENCES OF {Win32_LogicalDISK="'+Drive+'"} WHERE ResultClass=Win32_LogicalDiskToPartition ',
                                    'WQL',wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
       Partition:=DeviceIDFromAssoc(ObjSet);
       // on passe de la partition au disque physique
       ObjSet := Services.ExecQuery('REFERENCES OF {Win32_DiskPartition="'+Partition+'"} WHERE ResultClass=Win32_DiskDriveToDiskPartition',
                                    'WQL',wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
       result:=AnsiReplaceStr(DeviceIDFromAssoc(ObjSet),'\\','\');
       except
         result:='unknown';
       end;
    end;
    function nserie(i:byte):shortstring;
    var
         j:string;
         t:shortstring;
         k,l:word;
    begin
          t:='';
          j:=WMIGet('SELECT * FROM Win32_DiskDrive');
          k:=pos('Caption = "',j)+11;
          for l:=k to k+100 do
          begin
                if (j[l]=';')or(j[l]='"') then
                   break;
                t:=t+j[l];
          end;
          nserie:=t;
    end;
    exports
        nserie name 'nserie';
    begin
     
    end.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    hors sujet, coolric semble deja savoir utilser les WMI , citer un source sur les propriete d'un disque
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    J'ai le même résultat chez moi, mais pas de solution à apporter.

    A tout hasard si tu as plusieurs ecrans, voici mon code (tiré de stackexchange):
    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
    70
    71
     
    program ConsoleMonitorInformation;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
     
    function VarStrNull(VarStr: OleVariant): string; // dummy function to handle null variants
    begin
      Result := '';
      if not VarIsNull(VarStr) then
        Result := VarToStr(VarStr);
    end;
     
    procedure GetMonitorInfo;
    var
      objWMIService: OleVariant;
      colItems: OleVariant;
      colItem: OleVariant;
      oEnum: IEnumvariant;
      iValue: LongWord;
     
      function GetWMIObject(const objectName: String): IDispatch;
      var
        chEaten: Integer;
        BindCtx: IBindCtx;
        Moniker: IMoniker;
      begin
        OleCheck(CreateBindCtx(0, BindCtx));
        OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
        OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
      end;
     
    begin
      objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2');
      colItems := objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor', 'WQL', 0);
      oEnum := IUnknown(colItems._NewEnum) as IEnumvariant;
      if oEnum.Next(1, colItem, iValue) = 0 then
      begin
        Writeln('Name         ' + VarStrNull(colItem.Name));
        Writeln('Caption      ' + VarStrNull(colItem.Caption));
        Writeln('Description  ' + VarStrNull(colItem.Description));
        Writeln('Device ID    ' + VarStrNull(colItem.DeviceID));
        Writeln('Manufacturer ' + VarStrNull(colItem.MonitorManufacturer)); // Manufacter
        Writeln('Type         ' + VarStrNull(colItem.MonitorType)); // Model
        Writeln('');
      end;
    end;
     
    begin
      try
        CoInitialize(nil);
        try
          GetMonitorInfo;
          Readln;
        finally
          CoUninitialize;
        end;
      except
        on E: Exception do
        Begin
          Writeln(E.Classname, ': ', E.Message);
          Readln;
        End;
      end;
     
    end.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Salut

    As-tu essayé de comparer tes résultats avec ceux d'un outil d'inventaire de configuration tel que SIW (http://fr.gtopala.com/#axzz2rxp1KSko) ?

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    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 445
    Points
    28 445
    Par défaut
    commence par regarder dans le gestionnaire de périphériques de Windows

    pour mes deux écrans il m'affiche ceci, je doute que ton code fasse mieux

    Nom : moniteur.png
Affichages : 897
Taille : 3,8 Ko
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    salut comme dit sergio je suis déjà entrain d'utiliser le WMI

    dans le gestionnaire des périphériques je vois comme Paul TOTH Moniteur Plug and play .

    mais par contre j'ai trouver sur le net un logiciel Monitor Info avec son code source qui m'affiche un Hisense et une date je l'ai essayer sur un autre pc avec un écran HP et ça a marché une seule fois après ça n'a pas marchais lol... je comprends pas .

    @ Linkin j'utilise le même code . mais je vais commème l'essayer dans une autre form pour voir .

    at E-ric j'ai comparer et j'ai un Écran model HiSense et le Manufacturer Type d’écran Standard
    Merci
    Fichiers attachés Fichiers attachés

  8. #8
    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 445
    Points
    28 445
    Par défaut
    le code me fait penser ça ce que j'avais fait il y a bien longtemps pour identifier des machines IBM, ça ne doit plus fonctionner car le principe était d'aller lire le BIOS de la machine et d'en extraire les informations.

    mais le BIOS de la machine est physiquement en fin du premier Mo de mémoire...je ne sais pas comment fonctionne le P&P pour un écran...est-ce que le câble video permet de dialoguer avec le moniteur ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Bonjour à tous,
    pour ma part pour les infos sur les display : Taille, fréquence, numéro de série, manufacture, name etc etc...
    j'utilise en général l'Extended Display Identification Data qui est dans la base de registre à l'emplacement HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\
    Ensuite je choisi l'écran actif dans Control (ActiveService) et ensuite je découpe L'EDID qui est dans Device Parameters...
    @+

  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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par nuxtay Voir le message
    Bonjour à tous,
    pour ma part pour les infos sur les display : Taille, fréquence, numéro de série, manufacture, name etc etc...
    j'utilise en général l'Extended Display Identification Data qui est dans la base de registre à l'emplacement HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\
    Ensuite je choisi l'écran actif dans Control (ActiveService) et ensuite je découpe L'EDID qui est dans Device Parameters...
    @+
    ah ben voilà qui répond à ma question, merci

    http://en.wikipedia.org/wiki/Extende...ification_data
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    la source que j'ai attaché utilise le même système pour récupérer les informations du moniteur

    Monitor_info

    sinon un code exemple serais la bienvenue Merci

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Avec Wmi on sait savoir beaucoup de chose sur son matériel.

    La commande "CIM_Vidéocontroller" par exemple dans la liste des classes disponibles.

    Un lien utile : Tutoriels Delphi

    @+,

    Cincap

Discussions similaires

  1. [Débutant] récupérer le nom d'un modèle sans l'extension
    Par nawal59 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/10/2010, 21h23
  2. Comment récupérer les Marques spécifiques
    Par jmuffon dans le forum W4 Express
    Réponses: 1
    Dernier message: 06/11/2009, 11h06
  3. récupérer un variable dans un modèle
    Par abdeladim7 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 07/10/2009, 12h47
  4. Marques-pages perdus! comment les récupérer?
    Par acacia dans le forum Firefox
    Réponses: 16
    Dernier message: 11/11/2007, 17h58
  5. [JTree] Récupérer le modèle à partir de la sélection
    Par bizerta dans le forum Composants
    Réponses: 7
    Dernier message: 08/06/2005, 13h18

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