L'accès au registre windows


Cet article introduit un couple de fonctions pratiques, ce qui le rend facile à lire et à écrire des valeurs dans le Registre de Windows.
qu'EST-CE que LE REGISTRE?
C'est là que Windows stocke de nombreuses options de configuration et permet également aux applications d'accéder à ces données ainsi que d'enregistrer leurs propres données.
Si vous voulez prendre un coup d'oeil à la base de registre, exécutez simplement le REGEDIT.EXE l'application situé dans le répertoire Windows. Veillez à ne pas changer quoi que ce soit ou vous pourriez finir par ruiner votre installation!
Maintenant, les données du registre sont stockées dans une structure en arbre. Il y a beaucoup de racines (beaucoup d'arbres):
HKEY_CLASSES_ROOT
& nbsp & nbsp HKEY_CURRENT_USER
& nbsp & nbsp HKEY_LOCAL_MACHINE
& nbsp & nbsp HKEY_USERS
& nbsp & nbsp HKEY_PERFORMANCE_DATA
& nbsp & nbsp HKEY_CURRENT_CONFIG
& nbsp & nbsp HKEY_DYN_DATA

Chaque racine peut avoir des valeurs et des clés. Les valeurs sont des données stockées sous les noms d'éléments (panneau de droite de RegEdit). Les clés peuvent avoir des valeurs et d'autres touches, formant une structure en arbre (panneau de gauche de RegEdit).
TREGISTRY
Le TRegistry classe est déclarée dans le Registre de l'unité, de sorte que vous aurez à ajouter à cette unité dans la clause uses de l'unité ou du programme dans lequel vous souhaitez l'utiliser. Pour accéder à une valeur dans le registre, vous devez d'abord créer un objet de cette classe, affecter la racine de ses RootKey de la propriété (les valeurs sont définies dans l'unité Windows) et puis essayez d'ouvrir une touche avec le OpenKey méthode de la fonction qui retourne True en cas de succès. Ensuite, vous pouvez lire (avec le ReadXxxx fonctions) ou d'écriture (avec le WriteXxxx procédures) les valeurs de la clé ouverte et, après cela, vous devez fermer la clé avec CloseKey.
Lorsque vous avez terminé avec le registre, vous devez libérer le registre de l'objet que vous avez créé.
nous allons voir un exemple de la façon d'obtenir le nom du processeur dans notre ordinateur:
utilise le Registre, les Fenêtres, les boîtes de dialogue
& nbsp & nbsp procedure TForm1.Button1Click(Sender: TObject)
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := TRegistry.Créer
& ! & ! & ! & nbsp Reg.RootKey := HKEY_LOCAL_MACHINE
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKey('\Hardware\Description\System '
& ! & ! & ! & ! & ! & ! & ! & ! '\CentralProcessor\0', False), puis commencer
& ! & ! & ! & ! & ! & nbsp ShowMessage(Reg.ReadString('Identifiant'))
& ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & nbsp fin // si
& ! & ! & ! & nbsp Reg.Gratuit
& nbsp & nbsp fin

Vous pouvez voir un autre exemple dans l'article de la Détermination de l'application associée.
bien sûr, il ya beaucoup plus de choses que vous pouvez faire avec le registre, à l'instar de la création et de la suppression des clés et des valeurs...
Le TRegistryIniFile classe rend plus simple pour les applications d'écrire et de lire leurs informations de configuration vers et à partir de la base de registre, tout en TRegistry opère à un niveau inférieur.

GETREGISTRYDATA
Pour en simplifier la lecture d'une valeur de données à partir du registre, vous pouvez utiliser la fonction suivante qui permet de lire tout type de données dans le registre et la retourne comme une variante (string ou integer). La fonction effectue la gestion des exceptions.
utilise le Registre, Windows, SysUtils
& nbsp & nbsp fonction GetRegistryData(RootKey: HKEY Key, Value: string): variant
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& ! & ! & ! & nbsp RegDataType: TRegDataType
& ! & ! & ! & nbsp données. datasize, Len: entier
& ! & ! & ! & nbsp s: string
& nbsp & nbsp étiquette cantread
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := nil
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp Reg := TRegistry.Créer(KEY_QUERY_VALUE)
& ! & ! & ! & ! & ! & nbsp Reg.RootKey := RootKey
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKeyReadOnly(Clé), puis commencer
& ! & ! & ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp RegDataType := Reg.GetDataType(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (RegDataType = rdString) ou
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp (RegDataType = rdExpandString) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Reg.ReadString(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdInteger puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Reg.ReadInteger(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdBinary puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp données. datasize := Reg.GetDataSize(Valeur)

& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si données. datasize = -1 then goto cantread
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength(s, données. datasize)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Len := Reg.ReadBinaryData(Valeur, PChar(s)^, données. datasize)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Len <> données. datasize then goto cantread
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := s
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
cantread:
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Créer(SysErrorMessage(ERROR_CANTREAD))
& ! & ! & ! & ! & ! & ! & ! & nbsp à l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp s := ' // Libère la mémoire si alloués
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Créer(SysErrorMessage(GetLastError))
& ! & ! & ! & nbsp à l'exception de
& ! & ! & ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & nbsp fin
& nbsp & nbsp à l'exception de
& ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & nbsp soulever
& nbsp & nbsp fin

EXEMPLE d'APPEL
ShowMessage(GetRegistryData(HKEY_LOCAL_MACHINE,
& ! & ! & ! & ! '\Hardware\Description\System\CentralProcessor\0', 'Identifiant'))

SETREGISTRYDATA
Pour simplifier l'écriture d'une valeur de données pour le registre, vous pouvez utiliser la procédure suivante qui peut écrire n'importe quel type de données pour le registre.
La procédure effectue la gestion des exceptions.
utilise le Registre, Windows, SysUtils
& nbsp & nbsp procédure SetRegistryData(RootKey: HKEY Key, Value: string
& ! & ! & ! & nbsp RegDataType: TRegDataType de Données: variante)
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& ! & ! & ! & nbsp s: string
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := nil
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp Reg := TRegistry.Créer(KEY_WRITE)
& ! & ! & ! & ! & ! & nbsp Reg.RootKey := RootKey
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKey(Clé, True), alors commencez
& ! & ! & ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si RegDataType = rdUnknown puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp RegDataType := Reg.GetDataType(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si RegDataType = rdString puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteString(Valeur de Données)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdExpandString puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteExpandString(Valeur de Données)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdInteger puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteInteger(Valeur de Données)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdBinary puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp s := Données
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteBinaryData(Valeur, PChar(s)^, Longueur(s))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Créer(SysErrorMessage(ERROR_CANTWRITE))
& ! & ! & ! & ! & ! & ! & ! & nbsp à l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Créer(SysErrorMessage(GetLastError))
& ! & ! & ! & nbsp à l'exception de
& ! & ! & ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp Reg.Gratuit
& nbsp & nbsp fin

EXEMPLE d'APPEL
SetRegistryData(HKEY_LOCAL_MACHINE,
& ! & ! & ! & ! '\Software\Microsoft\Windows\CurrentVersion',
& ! & ! & ! & ! 'RegisteredOrganization', rdString, 'Latium Logiciel')









L'acces au registre windows


L'acces au registre windows : Plusieurs milliers de conseils pour vous faciliter la vie.


Cet article introduit un couple de fonctions pratiques, ce qui le rend facile a lire et a ecrire des valeurs dans le Registre de Windows.
qu'EST-CE que LE REGISTRE?
C'est la que Windows stocke de nombreuses options de configuration et permet egalement aux applications d'acceder a ces donnees ainsi que d'enregistrer leurs propres donnees.
Si vous voulez prendre un coup d'oeil a la base de registre, executez simplement le REGEDIT.EXE l'application situe dans le repertoire Windows. Veillez a ne pas changer quoi que ce soit ou vous pourriez finir par ruiner votre installation!
Maintenant, les donnees du registre sont stockees dans une structure en arbre. Il y a beaucoup de racines (beaucoup d'arbres):
HKEY_CLASSES_ROOT
& nbsp & nbsp HKEY_CURRENT_USER
& nbsp & nbsp HKEY_LOCAL_MACHINE
& nbsp & nbsp HKEY_USERS
& nbsp & nbsp HKEY_PERFORMANCE_DATA
& nbsp & nbsp HKEY_CURRENT_CONFIG
& nbsp & nbsp HKEY_DYN_DATA

Chaque racine peut avoir des valeurs et des cles. Les valeurs sont des donnees stockees sous les noms d'elements (panneau de droite de RegEdit). Les cles peuvent avoir des valeurs et d'autres touches, formant une structure en arbre (panneau de gauche de RegEdit).
TREGISTRY
Le TRegistry classe est declaree dans le Registre de l'unite, de sorte que vous aurez a ajouter a cette unite dans la clause uses de l'unite ou du programme dans lequel vous souhaitez l'utiliser. Pour acceder a une valeur dans le registre, vous devez d'abord creer un objet de cette classe, affecter la racine de ses RootKey de la propriete (les valeurs sont definies dans l'unite Windows) et puis essayez d'ouvrir une touche avec le OpenKey methode de la fonction qui retourne True en cas de succes. Ensuite, vous pouvez lire (avec le ReadXxxx fonctions) ou d'ecriture (avec le WriteXxxx procedures) les valeurs de la cle ouverte et, apres cela, vous devez fermer la cle avec CloseKey.
Lorsque vous avez termine avec le registre, vous devez liberer le registre de l'objet que vous avez cree.
nous allons voir un exemple de la façon d'obtenir le nom du processeur dans notre ordinateur:
utilise le Registre, les Fenetres, les boîtes de dialogue
& nbsp & nbsp procedure TForm1.Button1Click(Sender: TObject)
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := TRegistry.Creer
& ! & ! & ! & nbsp Reg.RootKey := HKEY_LOCAL_MACHINE
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKey('\Hardware\Description\System '
& ! & ! & ! & ! & ! & ! & ! & ! '\CentralProcessor\0', False), puis commencer
& ! & ! & ! & ! & ! & nbsp ShowMessage(Reg.ReadString('Identifiant'))
& ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & nbsp fin // si
& ! & ! & ! & nbsp Reg.Gratuit
& nbsp & nbsp fin

Vous pouvez voir un autre exemple dans l'article de la Determination de l'application associee.
bien sûr, il ya beaucoup plus de choses que vous pouvez faire avec le registre, a l'instar de la creation et de la suppression des cles et des valeurs...
Le TRegistryIniFile classe rend plus simple pour les applications d'ecrire et de lire leurs informations de configuration vers et a partir de la base de registre, tout en TRegistry opere a un niveau inferieur.

GETREGISTRYDATA
Pour en simplifier la lecture d'une valeur de donnees a partir du registre, vous pouvez utiliser la fonction suivante qui permet de lire tout type de donnees dans le registre et la retourne comme une variante (string ou integer). La fonction effectue la gestion des exceptions.
utilise le Registre, Windows, SysUtils
& nbsp & nbsp fonction GetRegistryData(RootKey: HKEY Key, Value: string): variant
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& ! & ! & ! & nbsp RegDataType: TRegDataType
& ! & ! & ! & nbsp donnees. datasize, Len: entier
& ! & ! & ! & nbsp s: string
& nbsp & nbsp etiquette cantread
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := nil
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp Reg := TRegistry.Creer(KEY_QUERY_VALUE)
& ! & ! & ! & ! & ! & nbsp Reg.RootKey := RootKey
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKeyReadOnly(Cle), puis commencer
& ! & ! & ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp RegDataType := Reg.GetDataType(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (RegDataType = rdString) ou
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp (RegDataType = rdExpandString) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Reg.ReadString(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdInteger puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Reg.ReadInteger(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdBinary puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp donnees. datasize := Reg.GetDataSize(Valeur)

& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si donnees. datasize = -1 then goto cantread
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength(s, donnees. datasize)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Len := Reg.ReadBinaryData(Valeur, PChar(s)^, donnees. datasize)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Len <> donnees. datasize then goto cantread
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := s
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
cantread:
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Creer(SysErrorMessage(ERROR_CANTREAD))
& ! & ! & ! & ! & ! & ! & ! & nbsp a l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp s := ' // Libere la memoire si alloues
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Creer(SysErrorMessage(GetLastError))
& ! & ! & ! & nbsp a l'exception de
& ! & ! & ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & nbsp fin
& nbsp & nbsp a l'exception de
& ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & nbsp soulever
& nbsp & nbsp fin

EXEMPLE d'APPEL
ShowMessage(GetRegistryData(HKEY_LOCAL_MACHINE,
& ! & ! & ! & ! '\Hardware\Description\System\CentralProcessor\0', 'Identifiant'))

SETREGISTRYDATA
Pour simplifier l'ecriture d'une valeur de donnees pour le registre, vous pouvez utiliser la procedure suivante qui peut ecrire n'importe quel type de donnees pour le registre.
La procedure effectue la gestion des exceptions.
utilise le Registre, Windows, SysUtils
& nbsp & nbsp procedure SetRegistryData(RootKey: HKEY Key, Value: string
& ! & ! & ! & nbsp RegDataType: TRegDataType de Donnees: variante)
& nbsp & nbsp var
& ! & ! & ! & nbsp Reg: TRegistry
& ! & ! & ! & nbsp s: string
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Reg := nil
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp Reg := TRegistry.Creer(KEY_WRITE)
& ! & ! & ! & ! & ! & nbsp Reg.RootKey := RootKey
& ! & ! & ! & ! & ! & nbsp si Reg.OpenKey(Cle, True), alors commencez
& ! & ! & ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si RegDataType = rdUnknown puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp RegDataType := Reg.GetDataType(Valeur)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si RegDataType = rdString puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteString(Valeur de Donnees)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdExpandString puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteExpandString(Valeur de Donnees)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdInteger puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteInteger(Valeur de Donnees)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sinon si RegDataType = rdBinary puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp s := Donnees
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.WriteBinaryData(Valeur, PChar(s)^, Longueur(s))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Creer(SysErrorMessage(ERROR_CANTWRITE))
& ! & ! & ! & ! & ! & ! & ! & nbsp a l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & nbsp Reg.CloseKey
& ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.Creer(SysErrorMessage(GetLastError))
& ! & ! & ! & nbsp a l'exception de
& ! & ! & ! & ! & ! & nbsp Reg.Gratuit
& ! & ! & ! & ! & ! & nbsp soulever
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp Reg.Gratuit
& nbsp & nbsp fin

EXEMPLE d'APPEL
SetRegistryData(HKEY_LOCAL_MACHINE,
& ! & ! & ! & ! '\Software\Microsoft\Windows\CurrentVersion',
& ! & ! & ! & ! 'RegisteredOrganization', rdString, 'Latium Logiciel')


L'accès au registre windows

L'accès au registre windows : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation