OVH Cloud OVH Cloud

API Registre (le retour)

9 réponses
Avatar
Jacques
Bonjour,
je suis toujours en prise avec les API du registre. Cette fois-ci, c'est la
fonction RegQueryValueEx qui me pose probleme. Voici le morceau de code en
question :

For i = 2 To rsUsers.RecordCount
MySubKey = "00" & CStr(i) & vbNullChar
Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)
If Reponse = ERROR_SUCCESS Then
MySubKey = "Name" & vbNullChar
RetValue = RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, 0,
ByVal strNameFound, lngData)
Else
MsgBox "Erreur lors de l'accès au Registre !", vbCritical + vbOKOnly,
"Erreur"
End If
RegCloseKey Rep
RegCloseKey Resp
Next i

Ce bout de code plante systématiquement VB qui se ferme, et hop, retour sur
le bureau !
La ligne fautive est le RegQueryValueEx, mais je n'arrive pas à déterminer
pourquoi...
Jusqu'à cette ligne, tout se passe comme il faut.
Les exemples que m'avais indiqués François sur support.microsoft.com m'ont
paru plutot confus...
Quelqu'un pourrait-il éclairer ma lanterne ?

Merci

Jacques

9 réponses

Avatar
Quel est ton but dans la base de registre ?
pourquoi n'utilises-tu pas les fonctions GetSetting...

-----Message d'origine-----
Bonjour,
je suis toujours en prise avec les API du registre. Cette


fois-ci, c'est la
fonction RegQueryValueEx qui me pose probleme. Voici le


morceau de code en
question :

For i = 2 To rsUsers.RecordCount
MySubKey = "00" & CStr(i) & vbNullChar
Reponse = RegOpenKeyEx(Resp, MySubKey, 0,


KEY_QUERY_VALUE, Rep)
If Reponse = ERROR_SUCCESS Then
MySubKey = "Name" & vbNullChar
RetValue = RegQueryValueEx(ByVal Rep,


ByVal MySubKey, 0, 0,
ByVal strNameFound, lngData)
Else
MsgBox "Erreur lors de l'accès au Registre !",


vbCritical + vbOKOnly,
"Erreur"
End If
RegCloseKey Rep
RegCloseKey Resp
Next i

Ce bout de code plante systématiquement VB qui se ferme,


et hop, retour sur
le bureau !
La ligne fautive est le RegQueryValueEx, mais je n'arrive


pas à déterminer
pourquoi...
Jusqu'à cette ligne, tout se passe comme il faut.
Les exemples que m'avais indiqués François sur


support.microsoft.com m'ont
paru plutot confus...
Quelqu'un pourrait-il éclairer ma lanterne ?

Merci

Jacques
.



Avatar
Zoury
Salut Jacques! :O)

Comment as-tu déclaré RegQueryValueEx?



Aussi, si tu veux, tu peux jeter un oeil à ma classe CRegistry, tu peux
copier la dernière version à partir d'ici :
http://groups.google.com/groups?selm=%2333VNZD1CHA.1768%40TK2MSFTNGP12

Les commentaires, comme tu pourras le remarquer sont souvent très à côté de
la plaque... (la "magie" du copier/coller)


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"Jacques" wrote in message
news:L%7jb.5678$
Bonjour,
je suis toujours en prise avec les API du registre. Cette fois-ci, c'est


la
fonction RegQueryValueEx qui me pose probleme. Voici le morceau de code en
question :

For i = 2 To rsUsers.RecordCount
MySubKey = "00" & CStr(i) & vbNullChar
Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)
If Reponse = ERROR_SUCCESS Then
MySubKey = "Name" & vbNullChar
RetValue = RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, 0,
ByVal strNameFound, lngData)
Else
MsgBox "Erreur lors de l'accès au Registre !", vbCritical + vbOKOnly,
"Erreur"
End If
RegCloseKey Rep
RegCloseKey Resp
Next i

Ce bout de code plante systématiquement VB qui se ferme, et hop, retour


sur
le bureau !
La ligne fautive est le RegQueryValueEx, mais je n'arrive pas à déterminer
pourquoi...
Jusqu'à cette ligne, tout se passe comme il faut.
Les exemples que m'avais indiqués François sur support.microsoft.com m'ont
paru plutot confus...
Quelqu'un pourrait-il éclairer ma lanterne ?

Merci

Jacques


Avatar
Jacques
Salut !
Voici la déclaration de la fonction :
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hkey As Long, _
ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long,
lpData As Any, lpcbData As Long) _
As Long
(copiée à partir de l'API Guide de AllAPI Network)

Je vais jeter un oeil au lien que tu m'indiques et poursuivre mes
recherches sur les API du Registre...
Merci de ton aide

A +,
Jacques



Salut Jacques! :O)

Comment as-tu déclaré RegQueryValueEx?



Aussi, si tu veux, tu peux jeter un oeil à ma classe CRegistry, tu
peux copier la dernière version à partir d'ici :
http://groups.google.com/groups?selm=%2333VNZD1CHA.1768%40TK2MSFTNGP12

Les commentaires, comme tu pourras le remarquer sont souvent très à
côté de la plaque... (la "magie" du copier/coller)




Avatar
Zoury
Salut Jacques! :O)

Ta déclaration est correcte.

Cependant...

Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)



Ici il te manque un paramètre...

RetValue = RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, 0, ByVal


strNameFound, lngData)

et ici il faut passé le 4 ième paramètre (lpType) ByVal et non ByRef..


Si ça peut t'être utile, voici du code semblable au tiens qui explique le
procédé...
(désolé pour les longues lignes..)
'***
' Module1
Option Explicit

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

Private Declare Function RegOpenKey _
Lib "advapi32.dll" _
Alias "RegOpenKeyA" _
( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByRef phkResult As Long _
) As Long

Private Declare Function RegQueryValueEx _
Lib "advapi32.dll" _
Alias "RegQueryValueExA" _
( _
ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
ByRef lpType As Long, _
ByRef lpData As Any, _
ByRef lpcbData As Long _
) As Long

Private Declare Function FormatMessage _
Lib "kernel32" _
Alias "FormatMessageA" _
( _
ByVal dwFlags As Long, _
ByRef lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByRef Arguments As Long _
) As Long

Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200&
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
Private Const LANG_NEUTRAL As Long = &H0&

' chaîne de type UNICODE se terminant par Chr$(0)
Private Const REG_SZ As Long = 1&
Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const ERROR_SUCCESS As Long = 0&

Private Sub Main()

Dim hKey As Long ' Handle de la clé
Dim lTypeValeur As Long ' Type de données de la valeur
Dim lTailleBuffer As Long ' Taille de la valeur
Dim sValeur As String ' Contenu de la valeur

' On ouvre la clé voulue
If (RegOpenKey(HKEY_CURRENT_USER, "SoftwareMicrosoftVisual
Basic6.0RecentFiles", hKey) = ERROR_SUCCESS) Then
' On récupère les informations concernant la valeur souhaitée
If (RegQueryValueEx(hKey, "1", 0, lTypeValeur, ByVal 0,
lTailleBuffer) = ERROR_SUCCESS) Then
' On vérifie si le type est un chaîne
If (lTypeValeur = REG_SZ) Then
' On créer le buffer avec la taille nécessaire
sValeur = String$(lTailleBuffer, Chr$(0))
'On récupère la donnée en rapellant la fonction
If ((RegQueryValueEx(hKey, "1", 0, ByVal 0, ByVal sValeur,
lTailleBuffer)) = ERROR_SUCCESS) Then
' On imprime la valeur en éliminant le Chr$(0) à la fin
de la chaîne
Debug.Print "Voici le dernier projet VB que vous avez
ouvert sur votre poste : " & Left$(sValeur, InStr(sValeur, Chr$(0)) - 1)
Else
Call MsgBox(GetSystemErrorMessage(Err.LastDllError),
vbOKOnly, "Erreur...")
End If
End If
Else
Call MsgBox(GetSystemErrorMessage(Err.LastDllError), vbOKOnly,
"Erreur...")
End If
Else
Call MsgBox(GetSystemErrorMessage(Err.LastDllError), vbOKOnly,
"Erreur...")
End If

End Sub

' Renvoi le message d'erreur survenu lors de l'appel d'un API
' On doit lui passé la valeur de Err.LastDLLError
Private Function GetSystemErrorMessage(ByRef lErrorNumber As Long) As String
GetSystemErrorMessage = String$(255, Chr$(0))
Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lErrorNumber,
LANG_NEUTRAL, GetSystemErrorMessage, 255, ByVal 0&)
GetSystemErrorMessage = Left$(GetSystemErrorMessage,
InStr(GetSystemErrorMessage, vbNewLine) - 1)
End Function
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Jacques
"Zoury" écrivait
news::

Salut Jacques! :O)

Ta déclaration est correcte.

Cependant...

Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)



Ici il te manque un paramètre...


Lequel ? La fonction demande 5 paramètres, et j'en ai bien 5...



RetValue = RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, 0,
ByVal


strNameFound, lngData)

et ici il faut passé le 4 ième paramètre (lpType) ByVal et non ByRef..




OK. J'ai changé cela. Mais ca plante toujours....
Voici mon code modifié (suite à la lecture de ton exemple):

MySubKey = "00" & CStr(i) & vbNullChar ' ici i = 2
Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)
If Reponse = ERROR_SUCCESS Then
MySubKey = "Name" & vbNullChar
If RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, ByVal 0&, ByVal 0&,
lngData) = 0 Then
strNameFound = Space$(lngData)
RegQueryValueEx ByVal Rep, ByVal MySubKey, 0, ByVal 0&, ByVal
strNameFound, lngData
End If
Else
MsgBox "Erreur lors de l'accès au Registre !", vbCritical +
vbOKOnly, "Erreur"
End If
Avatar
Zoury
Rebonjour! :O)

Lequel ? La fonction demande 5 paramètres, et j'en ai bien 5...



haha! j'ai mal lu, je croyais qu'il s'agissait de l'API RegQueryValueEx que
tu appelais la première fois. ;O)

OK. J'ai changé cela. Mais ca plante toujours....



ça plante sur quel ligne? le programme se ferme sans erreur auparavant? et
si tu modifies est-ce que ça fonctionne?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Zoury
> "si tu modifies" & "mon code" & "est-ce que ça fonctionne?"




--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Zoury
humm hummm,... (il commence à être tard..)

> "si tu modifies" & " mon code " & "est-ce que ça fonctionne?"



bon!
Avatar
Jacques
Salut !
J'ai isolé le problème mais je n'arrive pas pour autant à le résoudre.

MySubKey = "00" & CStr(i) & vbNullChar ' ici i = 2
Reponse = RegOpenKeyEx(Resp, MySubKey, 0, KEY_QUERY_VALUE, Rep)
If Reponse = ERROR_SUCCESS Then
MySubKey = "Name" & vbNullChar
If RegQueryValueEx(ByVal Rep, ByVal MySubKey, 0, ByVal 0&, ByVal 0&,
lngData) = 0 Then
strNameFound = Space$(lngData)
RegQueryValueEx ByVal Rep, ByVal MySubKey, 0, ByVal 0&, ByVal
strNameFound, lngData
End If
Else
MsgBox "Erreur lors de l'accès au Registre !", vbCritical +
vbOKOnly, "Erreur"
End If

Le premier RegQueryValueEx fonctionne sans problème. C'est le second qui
plante, et plus particulièrement le "Byval strNameFound".
J'ai vérifié le lngData qui a la bonne valeur pourtant. strNameFound
contient, juste avant le second appel 12 espaces (ce qui est correct :
longueur des données + caractère null)
Si je change ce paramètre, en omettant le Byval, ca plante plus mais
m'affiche un message d'erreur "Appel de fonction incorrect.".
Je commence à m'arracher les cheveux...
Merci pour ton aide précieuse.
A bientôt

Jacques

"Zoury" écrivait news:#UOuXI2kDHA.2424
@TK2MSFTNGP10.phx.gbl:

humm hummm,... (il commence à être tard..)

> "si tu modifies" & " mon code " & "est-ce que ça fonctionne?"



bon!