cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 2010
-
22 juil. 2007 à 20:36
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDerniè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..
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 201018 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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)
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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.