OVH Cloud OVH Cloud

Lister valeurs d'une clé du registre

1 réponse
Avatar
cbr
Bonjour,

Sous WINDOWS 98, j'avais une proc=E9dure que l'on m'avait=20
communiqu=E9e pour lister les valeurs des cl=E9s =E0=20
l'int=E9rieur d'une cl=E9 :
Or cela ne fonctionne pas sous XP et je ne comprends pas=20
pourquoi. Peut-=EAtre =E0 cause d'un changement dans le type=20
d'une donn=E9e.
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D
Voici les deux proc=E9dures sous EXCEL 97
Sub ListerToutesValeurs()
Dim Compteur As Long
Dim ssave As String
Dim hkey As Long
Dim x

Workbooks.Add

RegOpenKey HKEY_CURRENT_USER, "Software\cbr\ConvertHTML",=20
hkey
Do
ssave =3D String(255, 0)
If RegEnumValue(hkey, Compteur, ssave, 255, 0, ByVal 0&,=20
ByVal 0&, ByVal 0&) <> 0 Then Exit Do
x =3D GetKeyValue
(HKEY_CURRENT_USER, "Software\cbr\ConvertHTML",=20
StripTerminator(ssave))
'Debug.Print StripTerminator(ssave) pour r=E9cup=E9rer le=20
nom de l'entr=E9e
'Debug.Print x pour r=E9cup=E9rer la valeur
Compteur =3D Compteur + 1
Range("A" & Compteur + 1) =3D StripTerminator(ssave)
Range("B" & Compteur + 1) =3D x
Loop
RegCloseKey hkey
End Sub
'=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D
Private Function StripTerminator(ByVal sInput As String)=20
As String
'Cette fonction sert =E0 =E9l=E9miner tous les caract=E8res=20
superflus de la valeur
'de l'entr=E9e r=E9cup=E9r=E9e. ex Police:=3DArial:::::::: =3D Arial
Dim ZeroPos As Integer
ZeroPos =3D InStr(1, sInput, vbNullChar)
If ZeroPos > 0 Then
StripTerminator =3D Left$(sInput, ZeroPos - 1)
Else
StripTerminator =3D sInput
End If
End Function
'=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D

Merci

1 réponse

Avatar
François Picalausa
Hello,

As-tu *tous* les droits sur la clé?
Sinon, essaye ceci:

Dim hKey As Long, RC As Long

If RegOpenKeyEx(lngRoot, strKeyPath & vbNullChar, _
0, REG_ACCESSRIGHTS.KEY_QUERY_VALUE, _
hKey) = ERROR_SUCCESS Then

ssave = String$(255, 0)

RC = RegEnumValue(hkey, Compteur, ssave, 255, _
0, ByVal 0&, ByVal 0&, ByVal 0&)

Do While RC = ERROR_SUCCESS
x = GetKeyValue (HKEY_CURRENT_USER, _
"SoftwarecbrConvertHTML", StripTerminator(ssave))
'Debug.Print StripTerminator(ssave) _
pour récupérer le nom de l'entrée
'Debug.Print x pour récupérer la valeur
Compteur = Compteur + 1
Range("A" & Compteur + 1) = StripTerminator(ssave)
Range("B" & Compteur + 1) = x

RC = RegEnumValue(hkey, Compteur, ssave, 255, _
0, ByVal 0&, ByVal 0&, ByVal 0&)
Loop

RegCloseKey hkey
End If


(tiré de la documentation de l'API RegEnumValue:
hKey
[In] Handle to an open key. The key must have been opened with the
KEY_QUERY_VALUE access right. For more information, see Registry Key
Security and Access Rights. )

RegOpenKeyEx est compatible avec:
Client: Included in Windows XP, Windows 2000 Professional, Windows NT
Workstation, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT
Server.

RegOpenKey n'a été gardé que pour des raisons de compatibilité avec win-16.

Les nouvelles déclarations sont les suivantes:
Declare Function RegOpenKeyEx _
Lib "advapi32.dll" _
Alias "RegOpenKeyExA" _
( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long _
) _
As Long

Enum STANDARD_RIGHTS
Delete = (&H10000)
READ_CONTROL = (&H20000)
WRITE_DAC = (&H40000)
WRITE_OWNER = (&H80000)
SYNCHRONIZE = (&H100000)

STANDARD_RIGHTS_READ = (READ_CONTROL)
STANDARD_RIGHTS_WRITE = (READ_CONTROL)
STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
STANDARD_RIGHTS_ALL = (&H1F0000)
End Enum

Enum REG_ACCESSRIGHTS
KEY_QUERY_VALUE = (&H1)
KEY_SET_VALUE = (&H2)
KEY_CREATE_SUB_KEY = (&H4)
KEY_ENUMERATE_SUB_KEYS = (&H8)
KEY_NOTIFY = (&H10)
KEY_CREATE_LINK = (&H20)
KEY_WOW64_32KEY = (&H200)
KEY_WOW64_64KEY = (&H100)
KEY_WOW64_RES = (&H300)
KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or
KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or
KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
End Enum

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"" a écrit dans le
message de news:1fc8e01c458ec$b0f949b0$
Bonjour,

Sous WINDOWS 98, j'avais une procédure que l'on m'avait
communiquée pour lister les valeurs des clés à
l'intérieur d'une clé :
Or cela ne fonctionne pas sous XP et je ne comprends pas
pourquoi. Peut-être à cause d'un changement dans le type
d'une donnée.