ByVal dans l'API RegQueryValueEx

cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 - 22 juil. 2007 à 20:36
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 - 23 juil. 2007 à 16:37
Salut à tous,

Pour récuperer la valeur d'une entrée dans le registre (HKEY_CURRENT_USER\Environment\TMP) j'utilise les API RegOpenKeyEx et RegQueryValueEx comme suit :

(...)
' Ouvrir d'abord la clé
Dim hCle As Long
RegOpenKeyEx HKEY_CURRENT_USER, "Environment", 0, KEY_ALL_ACCESS, hCle
   
' On lit maintenant
Dim lpType As Long, LeBuffer As String, Longueur As Long
Longueur = 255
LeBuffer = Space(Longueur)
RegQueryValueEx hCle, ByVal "TMP", ByVal 0&, lpType, byval LeBuffer, Longueur
LeBuffer = Left(LeBuffer, Longueur - 1)
(...)
le code marche trés bien, MAIS : Pourquoi passer LeBuffer par valeur (si je la passe ByRef, VB plante ), je croyais que, pour attaquer la variable elle même, nous devons la passer ByRef..

14 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
22 juil. 2007 à 21:36
salut,

LeBuffer est un string donc un BSTR qui est déjà un pointeur en soi...passer un string par valeur en VB, correspond à passer par valeur le pointeur vers la chaine...passer un string par référence consiste à passer un pointeur vers le pointeur de la chaine (BSTR*)...d'où le plantage...

ShareVB
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 00:38
Merci pour votre réponse.

Mais, d'abord c'est quoi BSTR ?

Et le plus important est : pourquoi, donc, le code suivant :

Private Sub Concatener(ByVal Chaine As String)
    Chaine = Chaine + "_Fin"
   
End Sub

Private Sub Command1_Click()
    Dim maChaine As String
    maChaine = "Début"
    Concatener ByVal maChaine
    MsgBox maChaine

End Sub

affiche "Début" et non "Début_Fin"
et affiche "Début_Fin" lorsque je déclare Chaine ByRef ?

Merci d'avance
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juil. 2007 à 00:48
salut,

comme dit précédemment, byref sert de pointeur.

Si tu fais, pour reprendre ton exemple,
                MsgBox maChaine
avec le ByVal dans la fonction, il copie le résultat dans une mémoire (ne me demande pas de truc trop technique, suis pas assez calé) travaille avec la 'copie', sans modifier la valeur passée en paramètre.

A l'inverse, si c'était ByRef, c'est donc un pointeur, ce qui implique que la valeur que tu passes en paramètre, sera impactée sur son résultat suivant l'opération demandée dans la fonction. Il arrive que ByRef ne modifie en rien ta variable.
Quand tu fais

Call Concatener(maChaine)

Private Sub Concatener(ByRef Chaine As String)
    Chaine = Chaine + "_Fin"
End Sub

Fais comme si ça faisait (avec maChaine déclaré au niveau module) :

maChaine = "Début"
Call Concatener

Private Sub Concatener()
    maChaine = maChaine & "_Fin"
End Sub
   
@++

<hr size ="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 01:09
Je suis totalement d'accord avec vous Mortalino (joli pseudo en fait) mais c'est la où ja me plante :

Dans l'API RegQueryValueEx je croyais que la variable LeBuffer devrait être passée ByRef et non pas ByVal pour pouvoir écrire dedant, mais lorsque celà est fait, ça bloque, et le pire que ça marche lorsqu'on la passe ByVal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juil. 2007 à 01:20
c'est normal, lpData est de type Any, donc si tu lui passes en paramètre une variable de Type String, il faut mettre ByVal, alors qu'un autre type, rien (ou ByRef) suffit.

Dans ce cas précis, bien qu'ayant mis ByVal, ta variable aura la valeur de retour (logique, c'est le but)

C'est comme en grammaire, il y a des exceptions

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 01:32
Bon, je vais retenir ce cas comme exception, Merci
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juil. 2007 à 01:40
T'en fait pas, c'est très rare.
Par contre, ce n'est pas lié au type Any, je pense que c'est la fonction en elle même qui veut ça, codé en C.
Tu l'as aussi avec RegSetValueEx

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 01:49
Merci beacoup T-Bag, Oh ! je m'excuse Mortalino..

Pouvez vous me dire aussi, je sais j'abuse , c'est quoi un BSTR ?

Merci d'avance
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juil. 2007 à 02:15
Pas sûr car je ne fais pas de C mais je crois que c'est "pointeur vers variable"
Bon, je retourne dans ma cellule avant que les matons me voient

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 02:20
Merci pour tout
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 juil. 2007 à 08:03
BSTR, ce sont les chaines de caractère de VB
ca pointe sur


quatre octets pour la taille suivis des caractères suivis par un \0

permet que LenB soit très rapide : pas besoin de chercher le \0, la taille de la chaine est la valeur pointée par le BSTR

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
23 juil. 2007 à 08:31
BSTR et LPSTR sont different type de pointeur de chaine. Comme l'explique Ren ils ont des particularite qu'il faut connaitre par coeur s'il on veux coder proprement.

@+

E.B.
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 13:37
Merci pour vos réponses
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 juil. 2007 à 16:37
Les amis, j'ai trouvé une réponse qui parait  raisonnable sur Developpez.com par Mr.Delbeke :

http://www.developpez.net/forums/showthread.php?p=2329077#post2329077
0
Rejoignez-nous