Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBS] Utiliser les API Win32 ?????

11 réponses
Avatar
L'AMI Yves
Salut à tous !

D'habitude, la réponse à ce genre de question est "Google est ton ami !"

Mais si je viens ici, c'est que je n'ai pratiquement rien trouvé chez mon
ami (ou bien je ne sais pas chercher, ce qui est possible aussi)

Ce que j'ai trouvé, qui m'a semblé s'approcher au plus près de mon
problème, est ceci :

Set oShell=CreateObject("Wscript.Shell")
oShell.Run "%Windir%\System32\Rundll32.exe User32.dll, MonAPIQueJeVeux",
arguments

Mais ça me laisse perplexe. D'abord, est-ce que cette façon de faire peut
retourner une valeur (si je veux des propriétés de la fenêtre où je tourne,
par exemple) ?

Et ensuite, je n'arrive pas tellement à le faire marcher.

Alors merci aux bonnes âmes.

AMIcalement.

10 réponses

1 2
Avatar
Michel__D
Bonjour,

L'AMI Yves a écrit :
Salut à tous !

D'habitude, la réponse à ce genre de question est "Google est ton ami !"

Mais si je viens ici, c'est que je n'ai pratiquement rien trouvé chez mon
ami (ou bien je ne sais pas chercher, ce qui est possible aussi)

Ce que j'ai trouvé, qui m'a semblé s'approcher au plus près de mon
problème, est ceci :

Set oShell=CreateObject("Wscript.Shell")
oShell.Run "%Windir%System32Rundll32.exe User32.dll, MonAPIQueJeVeux",
arguments

Mais ça me laisse perplexe. D'abord, est-ce que cette façon de faire peut
retourner une valeur (si je veux des propriétés de la fenêtre où je tourne,
par exemple) ?

Et ensuite, je n'arrive pas tellement à le faire marcher.

Alors merci aux bonnes âmes.

AMIcalement.



Regarde si le lien suivant correspond à ce que tu recherche :

http://glsft.free.fr/index.php?option=com_content&task=view&idG&Itemid3
Avatar
Jean-Claude BELLAMY
"L'AMI Yves" a écrit dans le message de
groupe de discussion : 4ba7b2bf$0$14936$
[...] Ce que j'ai trouvé, qui m'a semblé s'approcher au plus près de mon
problème, est ceci :

Set oShell=CreateObject("Wscript.Shell")
oShell.Run "%Windir%System32Rundll32.exe User32.dll, MonAPIQueJeVeux",
arguments

Mais ça me laisse perplexe.


Il y a de quoi !

D'abord, est-ce que cette façon de faire peut
retourner une valeur (si je veux des propriétés de la fenêtre où je
tourne,
par exemple) ?


NON

Et ensuite, je n'arrive pas tellement à le faire marcher.


Normal !

Les DLL "lançables" avec rundll32 doivent respecter des critères très
précis!
Ce n'est donc que certaines DLL qui sont concernées!

De plus, la syntaxe d'exécution de "rundll32" est très STRICTE .


SYNTAXE
====== RUNDLL32.EXE <nom_de_dll>,<point_d_entree> <arguments optionels>

1)nom_de_dll
------------
Comporte ou non le chemin complet de la DLL
(tout dépend de sa localisation, si son répertoire fait partie ou non de la
variable d'environnement PATH)

ATTENTION : pour éviter tout pb, ce nom doit être le NOM COURT !!!
Aucun espace ou caractère "folklo" n'est autorisé !
p.ex. , si on veut appeler la DLL suivante
D:Program FilesMicrosoft OfficeOfficeautoclip.dll
il faudra taper (p.ex.) :
rundll32 d:PROGRA~1MICROS~1OFFICEautoclip.dll,ACBeginSearch


2)La VIRGULE
------------
Placée entre le nom de la dll et le point d'entrée, elle est TRES
IMPORTANTE.
Elle doit être "collée" entre eux, sans aucun espace.


3)Le point d'entrée
-------------------
C'est le nom de la fonction appelée dans la DLL.
Ces noms de fonctions sont communément désignés (par abus de langage) par
l'appellation d'API.
(Application Programming Interface)

Prototype de cette fonction (pour les développeurs) :
En 16 bits :
void FAR PASCAL __loadds
point_d_entree(HWND hwnd,HINSTANCE hinst,LPSTR lpszCmdLine, int nCmdShow);


En 32 bits :
void CALLBACK
point_d_entree(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int
nCmdShow);

NB: sous NT, le "point_d_entree" pourra être double :
- un suivi de "W", (UNICODE)
- un suivi de "A", (ANSI)


Paramètres du point d'entrée de la DLL
===================================== hwnd :
handle de fenêtre propriétaire des autres fenêtres de la DLL
hinst :
handle d'instance de la DLL
lpszCmdLine :
chaine ASCIIZ de paramètres
nCmdShow :
flag d'affichage de la fenêtre éventuellement affichée
0 = cachée
1 = normal
2 = iconifiée
3 = maximale
...

Exemple :
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:WINDOWSINFSHELL.INF

-> Rundll appelle l'API "InstallHinfSection()" de "Setupx.dll" et lui passe
les parametres suivants :
hwnd handle de la fenêtre dans laquelle on exécute RUNDDL
hinst HINSTANCE de SETUPX.DLL
lpszCmdLine "132 C:WINDOWSINFSHELL.INF"
nCmdShow (par défaut : normal)

Exemples pratiques
=================
1)Lancement direct d'un module du panneau de config
rundll32 shell32.dll,Control_RunDLL,tweakui.cpl

Là il y a un double lancement !
On exécute shell32.dll, en utilisant l'API "Control_RunDLL", auquel on
indique de charger le module de config de "TweakUI" (des powertoys)

2)Lancement d'une connexion à distance :
rundll rnaui.dll,RnaDial Free
dans cet exemple, "Free" est le nom de la connexion à distance

3)Création d'un raccourci permettant de quitter Windows rapidement :
rundll32 user32.dll,ExitWindowsEx

ATTENTION! ici "case sensitive" !.
Taper exactement "ExitWindowsEx" et non "exitwindowsex"

En ce qui concerne les "applets" du panneau de config, on peut utiliser
RUNDLL32, mais franchement, il est beaucoup plus SIMPLE de les appeler
DIRECTEMENT !


Donc tu vois que c'est un peu la galère et surtout très limité au niveau
possibilités!


Il vaut mieux appeler directement la DLL depuis le VBS, sans passer par
cette horreur de "oShell.Run ..." (sauf si on ne peut vraiment pas faire
autrement)

MAIS seulement si cette DLL a été conçue et enregistrée comme "contrôle
ActiveX" !

Si ce n'est pas le cas, il faut alors créer une dll interface déclarée comme
Activex, qui fera le "relais" avec n'importe quelle DLL.

C'est ce que je pratique abondamment dans mon ActiveX "JCB.OCX"
http://www.bellamyjc.org/download/vbs/jcb.ocx


P.ex., pour appeler depuis un VBS les fonctions "RegLoadKey" et
"RegUnLoadKey" de la dll "advapi32.dll" (qui servent à charger et décharger
une ruche dans la BDR), j'ai procédé ainsi :

Dans le contrôle JCB.VBP :
-------------------------

Private Declare Function RegLoadKey Lib "advapi32.dll" Alias
"RegLoadKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpFile As
String) _
As Long

Private Declare Function RegUnLoadKey Lib "advapi32.dll" Alias
"RegUnLoadKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String) As Long

Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As
Long) As Long

NB:
- j'ai simplifié le code ci-dessous.
En réalité il y a d'autres fonctions, p.ex. de gestion de privilèges.
- j'ai changé le nom des fonctions en "LoadHive" et "UnloadHive"
afin de ne pas confondre avec les fonctions d'origine, et aussi
parce que mes fonctions se limitent volontairement à HKEY_USERS.


Public Function LoadHive(ByVal strKeyName As String, ByVal hive As String)
As Boolean
LoadHive = False
retVal = RegLoadKey(HKEY_USERS, strKeyName, hive)
If retVal=0 Then LoadHive = True
End Function


Public Function UnloadHive(ByVal strKeyName As String) As Boolean
UnloadHive = False
retVal = RegFlushKey(HKEY_USERS)
If retVal <> 0 Then Exit Function
retVal = RegUnLoadKey(HKEY_USERS, strKeyName)
If retVal = 0 Then UnloadHive = True
End Function


Après compilation de ce contrôle, que j'ai nommé "JCB.TOOLS", , j'obtiens un
fichier JCB.OCX , que j'enregistre par la commande :
REGSVR32 JCB.OCX

Dans mes scripts :
-----------------
...
Set tools = wscript.CreateObject("JCB.tools")
...
result=tools.loadhive(account,hive)
...
result=tools.unloadhive(account)
...


Comme tu vois, c'est un peu du boulot !!!!



--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Avatar
Bertrand Lenoir-Welter
Jean-Claude BELLAMY

On cherche un ami, on trouve un Bellamy. Techniquement, c'est pas plus
mal. J'en profite pour poser une question de béotien, n'étant guère
utilisateur de DLLs : Pourquoi ne pas tout simplement faire un
LoadLibrary(), établir le lien avec la fonction puis l'appeler ? Ca
semble quand même plus simple et plus direct, non ? Dans quel cas
doit-on obligatoirement passer par RUNDLL32 ? Je précise que je n'ai
jamais mis le nez dans VB et assimilés, donc il manque peut-être une
donnée dans le paysage.

Et désolé si c'est une question idiote...
Avatar
Jean-Claude BELLAMY
"Bertrand Lenoir-Welter" <bertrand-dot-2010-at-galaad-dot-net> a écrit dans
le message de groupe de discussion :
4ba7d42d$0$15848$
Jean-Claude BELLAMY

On cherche un ami, on trouve un Bellamy. Techniquement, c'est pas plus
mal.


;-)
J'en profite pour poser une question de béotien, n'étant guère utilisateur
de DLLs : Pourquoi ne pas tout simplement faire un LoadLibrary(), établir
le lien avec la fonction puis l'appeler ?



En Delphi, C, VB, ... pas de problème, c'est ce qu'on va faire ...

Le seul problème est que la fonction "LoadLibrary" n'existe pas en VBScript
!
C''est d'ailleurs une lacune majeure de ce langage.
Tu vas me dire alors "Mais pourquoi utiliser VBScript" ?

Et bien parce que c'est un langage INTERPRÉTÉ, donc très facile à mettre en
oeuvre (un simple éditeur texte suffit, pas de compilateur ni éditeur de
liens, ...), et à la syntaxe très simple. De plus on le trouve sous toutes
les versions de Windows, depuis Win95 et NT4 jusqu'à Win7 et W2K8 R2!

C'est assez primaire, il ne faut pas chercher à faire des trucs "exotiques",
mais pour le tout-venant, pour des scripts un peu plus complets que des
batchs, c'est parfait.

Je suis un inconditionnel de Delphi (Pascal), mais quand j'ai un programme
très court et simple à créer, avec des tests immédiats, je fais cela en VBS.
Il ne me faut en général que quelques minutes pour écrire un VBS "lambda".

Ca semble quand même plus simple et plus direct, non ?


Oui, bien sûr !

Dans quel cas doit-on obligatoirement passer par RUNDLL32 ?


Jamais !
Ou plutôt seulement quand on est une "grosse feignasse" et qu'on veut ouvrir
rapidement CERTAINES DLL utilitaires (essentiellement tout ce qui est
panneau de config, ou encore pour verrouiller le poste de travail, ...) ;-)

Je précise que je n'ai jamais mis le nez dans VB et assimilés, donc il
manque peut-être une donnée dans le paysage.



Et désolé si c'est une question idiote...


Ce qui aurait été idiot, c'est de ne pas la poser ! :-)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Avatar
L'AMI Yves
Encore une fois, MERCI JCB. Là, je ne suis pas déçu du voyage...

Tellement que finalement, je vais exposer clairement mon problème, car ce
soir
"grosse feignasse" me décrit assez bien (c'est quand même pas tous les
jours...)

J'ai fait un petit utilitaire en reprenant ton exemple de boite de dialogue
("Test", je
crois) ouverte avec Internet Explorer, et un VBS qui l'ouvre, et qui
récupère les
informations rentrées par l'utilisateur. Tant bien que mal, j'arrive à peu
près à mes
fins (question ces derniers jours sur la gestion des icônes=>magie noire
???).

Mais pour faire plus propre encore, j'aurais voulu supprimer la barre de
titre de
la fenêtre Internet Explorer, voire la rendre modale. D'où ma question.

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper" bestialement,
et à
m'économiser une ou deux migraines...

Voli, voilou.

AMIcalement.

"Jean-Claude BELLAMY" a écrit dans le
message de news: 4ba7ed75$0$15842$

"Bertrand Lenoir-Welter" <bertrand-dot-2010-at-galaad-dot-net> a écrit
dans le message de groupe de discussion :
4ba7d42d$0$15848$
Jean-Claude BELLAMY

On cherche un ami, on trouve un Bellamy. Techniquement, c'est pas plus
mal.


;-)
J'en profite pour poser une question de béotien, n'étant guère
utilisateur de DLLs : Pourquoi ne pas tout simplement faire un
LoadLibrary(), établir le lien avec la fonction puis l'appeler ?



En Delphi, C, VB, ... pas de problème, c'est ce qu'on va faire ...

Le seul problème est que la fonction "LoadLibrary" n'existe pas en
VBScript !
C''est d'ailleurs une lacune majeure de ce langage.
Tu vas me dire alors "Mais pourquoi utiliser VBScript" ?

Et bien parce que c'est un langage INTERPRÉTÉ, donc très facile à mettre
en oeuvre (un simple éditeur texte suffit, pas de compilateur ni éditeur
de liens, ...), et à la syntaxe très simple. De plus on le trouve sous
toutes les versions de Windows, depuis Win95 et NT4 jusqu'à Win7 et W2K8
R2!

C'est assez primaire, il ne faut pas chercher à faire des trucs
"exotiques", mais pour le tout-venant, pour des scripts un peu plus
complets que des batchs, c'est parfait.

Je suis un inconditionnel de Delphi (Pascal), mais quand j'ai un
programme très court et simple à créer, avec des tests immédiats, je fais
cela en VBS. Il ne me faut en général que quelques minutes pour écrire un
VBS "lambda".

Ca semble quand même plus simple et plus direct, non ?


Oui, bien sûr !

Dans quel cas doit-on obligatoirement passer par RUNDLL32 ?


Jamais !
Ou plutôt seulement quand on est une "grosse feignasse" et qu'on veut
ouvrir rapidement CERTAINES DLL utilitaires (essentiellement tout ce qui
est panneau de config, ou encore pour verrouiller le poste de travail,
...) ;-)

Je précise que je n'ai jamais mis le nez dans VB et assimilés, donc il
manque peut-être une donnée dans le paysage.





Et désolé si c'est une question idiote...


Ce qui aurait été idiot, c'est de ne pas la poser ! :-)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr


Avatar
Jean-Claude BELLAMY
"L'AMI Yves" a écrit dans le message de
groupe de discussion : 4ba7f3c8$0$10091$
Encore une fois, MERCI JCB. Là, je ne suis pas déçu du voyage...

Tellement que finalement, je vais exposer clairement mon problème, car ce
soir
"grosse feignasse" me décrit assez bien (c'est quand même pas tous les
jours...)


Il n'y a pas de honte !
L'informatique est un truc de feignasse! ;-)


J'ai fait un petit utilitaire en reprenant ton exemple de boite de
dialogue ("Test", je
crois) ouverte avec Internet Explorer, et un VBS qui l'ouvre, et qui
récupère les
informations rentrées par l'utilisateur. Tant bien que mal, j'arrive à peu
près à mes
fins (question ces derniers jours sur la gestion des icônes=>magie noire
???).

Mais pour faire plus propre encore, j'aurais voulu supprimer la barre de
titre de
la fenêtre Internet Explorer, voire la rendre modale. D'où ma question.

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper" bestialement,


No problem !

et à m'économiser une ou deux migraines...



Il doit certainement y avoir ce qu'il te faut dans mon contrôle ActiveX
"JCB.OCX"
Mais vu l'heure et le fait que je l'ai conçu il y a plusieurs années, je ne
me souviens plus de tout ce que j'y ai mis dedans!

En attendant, tu peux faire un tour du côté de 2 de mes scripts qui
utilisent les boites de dialogue contenue dans JCB.OCX :
http://www.bellamyjc.org/fr/vbsdownload.html#iconfolder
http://www.bellamyjc.org/fr/vbsdownload.html#selecticon

P.ex. la fonction "MsgBox3" affiche une boite avec 3 boutons

set jcbtool = wscript.CreateObject("jcb.tools","")
rep=jcbtool.MsgBox3(texte-en-haut,question,titre-de-la-boite,label-bouton1,label-bouton2,label-bouton3)

rep contient 1, 2 ou 3 suivant le bouton sur lequel on a appuyé



Autre exemple : la fonction "Openfile", pour choisir un fichier
fichier=jcbtool.OpenFile(nom-initial,filtre,extension-par-défaut,titre-de-la-boite)

Le filtre a la syntaxe habituelle :
type de fichier|*.extension|type de fichier|*.extension|type de
fichier|*.extension....

P.ex. :
Filtre="Icône(*.ico)|*.ico|Bibliothèque(*.dll)|*.dll|Exécutable(*.exe)|*.exe|Tout
fichier(*.*)|*.*"


Il faudra que j'établisse une liste de tout ce qui est disponible ...PS: ne pas oublier d'enregistrer jcb.ocx au préalable (c'est à faire une
seule fois pour toutes)
Dans une fenêtre de commandes, exécuter :
REGSVR32 "k:trucs diversfolklosjcb.ocx"

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Avatar
Bertrand Lenoir-Welter
L'AMI Yves :

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper"
bestialement, et à m'économiser une ou deux migraines...




C'est dégoûtant ! Allez faire ça ailleurs !
Avatar
Jean-Claude BELLAMY
"Bertrand Lenoir-Welter" <bertrand-dot-2010-at-galaad-dot-net> a écrit dans
le message de groupe de discussion :
4ba89b6b$0$15854$
L'AMI Yves :

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper"
bestialement, et à m'économiser une ou deux migraines...




C'est dégoûtant ! Allez faire ça ailleurs !



MDR + ROTFL !!!!!!!
:-) :-) :-) :-) :-) :-)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Avatar
L'AMI Yves
"Bertrand Lenoir-Welter" <bertrand-dot-2010-at-galaad-dot-net> a écrit dans
le message de news: 4ba89b6b$0$15854$
L'AMI Yves :

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper"
bestialement, et à m'économiser une ou deux migraines...




C'est dégoûtant ! Allez faire ça ailleurs !


Faut pas prendre les mots au pied de la lettre...
Avatar
L'AMI Yves
Je reconnais avoir plutôt survolé tes indications qu'étudié de façon
approfondie,
mais voici ce que j'en retire : dans ton jcb.ocx, tu as fait ta petite
cuisine pour
créer les points d'entrée nécessaires à tes besoins spécifiques, derrière
lesquels
tu as programmé les appels API qui permettaient d'effectuer la tâche
attendue
de ces points d'entrée. En parcourant les deux exemples que tu me donnes,
je
comprends jcbtool, objet créé à partir de jcb.ocx, comme un objet dont les
propriétés et méthodes sont ces fameux points d'entrée.
Si j'ai bon, pour ce que je veux faire moi, deux solutions :
1) j'ai la chance que certains points d'entrée répondent à mes besoins -
mais ce
serait mieux d'avoir un jcb.chm (par exemple) comme doc de jcb.ocx
2) si les deux conditions ci-dessus ne sont pas remplies, il me faut me
faire mon
propre amiym.ocx, ce qui suppose que je dispose de compilateur idoine, et
de
la connaissance qui va avec : deux conditions qui ne sont pas remplies...
Il ne me reste que mes yeux pour pleurer... ou mon bon vieux VB5
Initiation,
mais ça va être plus lourd que VBS...

Est-ce que j'ai bon ?

AMIcalement

"Jean-Claude BELLAMY" a écrit dans le
message de news: 4ba7fc05$0$17897$

"L'AMI Yves" a écrit dans le message de
groupe de discussion : 4ba7f3c8$0$10091$
Encore une fois, MERCI JCB. Là, je ne suis pas déçu du voyage...

Tellement que finalement, je vais exposer clairement mon problème, car
ce soir
"grosse feignasse" me décrit assez bien (c'est quand même pas tous les
jours...)


Il n'y a pas de honte !
L'informatique est un truc de feignasse! ;-)


J'ai fait un petit utilitaire en reprenant ton exemple de boite de
dialogue ("Test", je
crois) ouverte avec Internet Explorer, et un VBS qui l'ouvre, et qui
récupère les
informations rentrées par l'utilisateur. Tant bien que mal, j'arrive à
peu près à mes
fins (question ces derniers jours sur la gestion des icônes=>magie noire
???).

Mais pour faire plus propre encore, j'aurais voulu supprimer la barre de
titre de
la fenêtre Internet Explorer, voire la rendre modale. D'où ma question.

Si tu l'as déjà fait, je suis tout à fait disposé à "pomper"
bestialement,


No problem !

et à m'économiser une ou deux migraines...



Il doit certainement y avoir ce qu'il te faut dans mon contrôle ActiveX
"JCB.OCX"
Mais vu l'heure et le fait que je l'ai conçu il y a plusieurs années, je
ne me souviens plus de tout ce que j'y ai mis dedans!

En attendant, tu peux faire un tour du côté de 2 de mes scripts qui
utilisent les boites de dialogue contenue dans JCB.OCX :
http://www.bellamyjc.org/fr/vbsdownload.html#iconfolder
http://www.bellamyjc.org/fr/vbsdownload.html#selecticon

P.ex. la fonction "MsgBox3" affiche une boite avec 3 boutons

set jcbtool = wscript.CreateObject("jcb.tools","")

rep=jcbtool.MsgBox3(texte-en-haut,question,titre-de-la-boite,label-bouton1,label-bouton2,label-bouton3)

rep contient 1, 2 ou 3 suivant le bouton sur lequel on a appuyé



Autre exemple : la fonction "Openfile", pour choisir un fichier

fichier=jcbtool.OpenFile(nom-initial,filtre,extension-par-défaut,titre-de-la-boite)

Le filtre a la syntaxe habituelle :
type de fichier|*.extension|type de fichier|*.extension|type de
fichier|*.extension....

P.ex. :

Filtre="Icône(*.ico)|*.ico|Bibliothèque(*.dll)|*.dll|Exécutable(*.exe)|*.exe|Tout
fichier(*.*)|*.*"


Il faudra que j'établisse une liste de tout ce qui est disponible ...PS:
ne pas oublier d'enregistrer jcb.ocx au préalable (c'est à faire une
seule fois pour toutes)
Dans une fenêtre de commandes, exécuter :
REGSVR32 "k:trucs diversfolklosjcb.ocx"

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr


1 2