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

RegEnumKeyEx retourne 87

11 réponses
Avatar
neirda
Bonjour =E0 tous,

la fonction RegEnumKeyEx me retourne toujours l'erreur 87(param=E8tres
incorrect), je n'ai pas du tout saisir :p

Public Const HKEY_CLASSES_ROOT =3D &H80000000
Public Const REG_SZ =3D 1
Public Const REG_DWORD =3D 4
Public Const READ_CONTROL =3D &H20000
Public Const KEY_READ =3D &H20019

Public 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

Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As
Long) As Long

Public Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias
"RegEnumKeyExA" (ByVal hKey As Long, _
ByVal dwIndex As
Long, ByVal lpName As String, _
lpcbName As Long,
lpReserved As Long, _
ByVal lpClass As
String, lpcbClass As Long, _
lpftLastWriteTime
As Any) As Long

Public Sub Lister()
Dim hand As Long
Dim nom As String
Dim time As Variant
Dim tailleNom As Long
Dim unusedA As Long
Dim unusedB As Long
Dim ind As Long

MsgBox RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, READ_CONTROL,
hand)
MsgBox RegEnumKeyEx(hand, 0, nom, tailleNom, unusedA,
vbNullString, unusedB, time)
MsgBox nom & " =3D> " & tailleNom
MsgBox RegCloseKey(hand)
End Sub

10 réponses

1 2
Avatar
François Picalausa
On 4月16日, 午後12:17, "neirda" mail.com> wrote:
Bonjour à tous,

la fonction RegEnumKeyEx me retourne toujours l'erreur 87(paramètres
incorrect), je n'ai pas du tout saisir :p

Public Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias _
"RegEnumKeyExA" (ByVal hKey As Long, _
ByVal dwIndex As Long, ByVal lpName As String, _
lpcbName As Long, lpReserved As Long, _
ByVal lpClass As String, lpcbClass As Long, _
lpftLastWriteTime As Any) As Long
<snip>
    MsgBox RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, READ_CON TROL,
hand)
    MsgBox RegEnumKeyEx(hand, 0, nom, tailleNom, unusedA,
vbNullString, unusedB, time)
    MsgBox nom & " => " & tailleNom
    MsgBox RegCloseKey(hand)
End Sub



Hello,

Selon la documentation:
<quote>A handle to an open registry key. The key must have been opened
with the KEY_ENUMERATE_SUB_KEYS access right. For more information,
see Registry Key Security and Access Rights.</quote>
En d'autres termes, tu as une première erreur au niveau de l'accès
(puisque le droit approprié n'est pas demandé).
=> RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_ENUMERATE_SUB_KEYS,
hand)

Pour la 87 en question, le problème est que tu passes de réfà ©rences à
des long, voir à des Variant (Je connais assez peut d'API sachant ce
qu'est un Variant), lorsqu'un type de donnée précis t'es demand é.
Tu devrais donc réaliser l'appel suivant:
MsgBox RegEnumKeyEx(hand, 0, nom, tailleNom, Byval 0&, vbNullString,
Byval 0&, Byval 0&)

De plus, il te faut préallouer le buffer nom, pour que l'API puisse
écrire dedans:
nom = String$(vbnullchar, 255) 'nom max d'une clé : 255 caractè re
tailleNom = 256 'Inclu le final ajouté par VB à l'appel de l 'API
MsgBox RegEnumKeyEx(hand, 0, nom, tailleNom, Byval 0&, vbNullString,
Byval 0&, Byval 0&)

En bref:
http://faq.vb.free.fr/index.php?questionY -> http://support.microsoft.c om/?kbid&7908

François Picalausa
Avatar
neirda
nom = String$(vbnullchar, 255)
-> Me renvoie une erreur : type dismatch

nom = Space(BUFFER_SIZE) 'Buffer_size définit préalablement à 255
-> Avec ca ca passe mieux

Merci pour ton aide, tu as résolu mon pb :)
Avatar
François Picalausa
On 4月16日, 午後2:06, "neirda" ail.com> wrote:
nom = String$(vbnullchar, 255)
-> Me renvoie une erreur : type dismatch

nom = Space(BUFFER_SIZE) 'Buffer_size définit préalablement à 255
-> Avec ca ca passe mieux

Merci pour ton aide, tu as résolu mon pb :)



Hello,

Effectivement, il fallait lire String$(255, vbnullchar).

Merci du retour!

François
Avatar
neirda
en effet c'est mieux :p

J'ai désormais un problème un peu différent, j'essaye de boucler pour
lister toutes les sous clefs mais cela n'affiche que la première clef
trouvé (en l'occurence "ACPI" à chaque tour...)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -

Dim hand, tailleNom As Long
Dim nom As String
Dim cnt As Integer

nom = String$(255, vbNullChar)
tailleNom = BUFFER_SIZE + 1

r_err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware", 0,
KEY_ENUMERATE_SUB_KEYS, hand)
If r_err = 0 Then
While RegEnumKeyEx(hand, cnt, nom, tailleNom, ByVal 0&,
vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
MsgBox " " + Left$(nom, BUFFER_SIZE)
cnt = cnt + 1
nom = String$(255, vbNullChar)
Wend
Else
MsgBox "Erreur ouverture de la clef du registre: " & r_err
End If
Avatar
neirda
euh petite correction, avec ce code ca n'affiche que le nom de la
première sous clef, ensuite ce ne sont que des champs vide :(
Avatar
neirda
Trouvé!

Il fallait réinitialiser la varibale tailleNom comme on le fait pour
la variable nom...

il fallait donc rajouté en fin de boucle : tailleNom = BUFFER_SIZE +
1 ' soit 256 ;)


Ca fonctionne nickel!

Merci encore pour ton aide!
Avatar
neirda
Rien qu'une petite dernière question: Savez vous où je peux trouver de
l'aide sur la fonction string$ ou left$ ?

Le $ n'est pas pris en compte par google !

Merci !!
Avatar
François Picalausa
On 4月16日, 午後2:39, "neirda" ail.com> wrote:
Rien qu'une petite dernière question: Savez vous où je peux tro uver de
l'aide sur la fonction string$ ou left$ ?

Le $ n'est pas pris en compte par google !

Merci !!



Hello,

Ce sont des équivalent des fonctions String et Left. La seule
différence est que ces fonctions prennent en entrée des String au lieu
des Variant (et sont plus rapide par conséquent).
Leur documentation est donc identique à:
String : http://msdn2.microsoft.com/en-us/library/aa263374(VS.60).aspx
Left : http://msdn2.microsoft.com/en-us/library/aa445061(VS.60).aspx

François
Avatar
neirda
Avatar
neirda
Petite précision needed ;)

J'essayes désormais de récupérer le contenu d'une valeur.

Cela fonctionne mais si dans le bloc de déclaration des variables je
déclare une nouvelle variable, ca change le résultat.

L'exemple sera plus parlant:

Dim hKey, lNameSize, lDataSize As Long
Dim sName, sData As String
Dim iCpt, iErr As Integer

'Préallocation des buffers
sName = Space(255)
lNameSize = BUFFER_SIZE
sData = Space(255)
lDataSize = BUFFER_SIZE

'Ouverture de la clef
iErr = RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID{1900415A-2AEB-4870-
A70A-26181505F065}LocalServer32", 0, KEY_ALL_ACCESS, hKey)

If iErr = 0 Then
'Récupération du path du mgwmapp référencé...
iErr = RegEnumValue(hKey, 0, sName, lNameSize, 0, ByVal 0&,
sData, lDataSize)
If iErr = 0 Then
MsgBox Left$(sData, lDataSize - 13)
Else
MsgBox "Erreur lecture d'une valeur de la base de
registre: " & iErr
End If
Else
MsgBox "Erreur ouverture de la clef du registre: " & iErr
End If


LA TOUT VA BIEN

Dim hKey, lNameSize, lDataSize As Long
Dim sName, sData, SPATH As String
Dim iCpt, iErr As Integer

'Préallocation des buffers
sName = Space(255)
lNameSize = BUFFER_SIZE
sData = Space(255)
lDataSize = BUFFER_SIZE

'Ouverture de la clef
iErr = RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID{1900415A-2AEB-4870-
A70A-26181505F065}LocalServer32", 0, KEY_ALL_ACCESS, hKey)

If iErr = 0 Then
'Récupération du path du mgwmapp référencé...
iErr = RegEnumValue(hKey, 0, sName, lNameSize, 0, ByVal 0&,
sData, lDataSize)
If iErr = 0 Then
msgbox Left$(sData, lDataSize - 13)
Else
MsgBox "Erreur lecture d'une valeur de la base de
registre: " & iErr
End If
Else
MsgBox "Erreur ouverture de la clef du registre: " & iErr
End If

EN RAJOUTANT SPATH DANS LA DECLARATION, et même sans l'utiliser par la
suite, la fonction RegEnumValue me retourne une suite de vbnullchar...

Je ne comprends pas pourquoi...
1 2