Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
34
19 févr. 2005 à 01:00
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim x As Long
Dim s As String
x = 123
s = "chaine"
MsgBox "Adresse de x: " & VarPtr(x)
MsgBox "Adresse de s: " & VarPtr(s)
Test x, x, s, s
MsgBox "la valeur de x est modifié: " & x
End Sub
Private Sub Test(x1 As Long, ByVal x2 As Long, s1 As String, ByVal s2 As String)
Dim Z As Long
Dim Z1 As Long
Dim Z2 As Long
Dim Z3 As Long
Dim P As Long
' même adresse que x
MsgBox "Adresse de x1: " & VarPtr(x1)
' adresse différente de x
MsgBox "Adresse de x2: " & VarPtr(x2)
' même adresse que s
MsgBox "Adresse de s1: " & VarPtr(s1)
' adresse différente de s
MsgBox "Adresse de s2: " & VarPtr(s2)
' quand les adresses sont les mêmes ça veut dire que c'est la même variable
' x1 et x sont la même variable avec des noms différents
' quand les adresses sont diffentes ça veut dire que les zones sont différentes
' x2 et x sont 2 variables différentes avec la même valeur
' pour un API c'est différent BYval renvoie un pointeur sur la variable
x2 = VarPtr(x1)
CopyMemory Z, ByVal x2, 4
MsgBox "on retrouve la valeur de x: " & Z
' explications:
' x2 et x1 sont 2 variables différentes
' dans x2 on met l'adresse de x1 donc l'adresse de x puisque c'est la même variable
' ByVal x2 renvoie la valeur qui se trouve à l'adresse contenue dans x2
' l'adresse contenue dans x2 c'est bien celle de x
' donc dans Z on retrouve x
' on peut même modifier x en passant par ByVal x2
' voir le dernier MsgBox
Z = 456
CopyMemory ByVal x2, Z, 4
' en VB l'adresse d'une chaîne est un pointeur sur la chaîne en Unicode
P = VarPtr(s1)
CopyMemory Z, P, 4
MsgBox "toujours Adresse de s1: " & Z
P = Z
CopyMemory Z, ByVal P, 4
MsgBox "pointeur sur s1: " & Z & " = " & StrPtr(s1)
P = Z
CopyMemory Z1, ByVal P, 4
P = P + 4
CopyMemory Z2, ByVal P, 4
P = P + 4
CopyMemory Z3, ByVal P, 4
' REMARQUE: le contenu des zones numériques est inversée
' 680063 - 690061 - 65006E --> hc - ia - en
MsgBox "contenu de s1 : " & Hex$(Z1) & " - " & Hex$(Z2) & " - " & Hex$(Z3) '65006E e-n
' API: une chaîne passée avec ByRef est un pointeur sur une chaîne clonée en non Unicode
CopyMemory Z, s1, 4
' ATTENTION: pas de manipulation de chaîne sous peine de perdre la chaîne clonée
' MsgBox "pseudo pointeur sur s1= " & (Z)
' Longueur de la chaîne sur 4 caractères (= 6)
P = Z - 4
CopyMemory Z1, ByVal P, 4
' ensuite contenu de la chaîne
P = Z
CopyMemory Z2, ByVal P, 4
P = Z + 4
CopyMemory Z3, ByVal P, 4
' 6 - 69616863 - 656E --> iahc - en
MsgBox "contenu du clone de s1: " & Hex$(Z1) & " - " & Hex$(Z2) & " - " & Hex$(Z3)
' API: une chaîne passée avec ByVal est directement l'adresse de la chaîne clonée
P = Z
CopyMemory Z, ByVal s1, 4
MsgBox "contenu du clone de s1: " & Hex$(Z) '69616863
' comment l'API peut elle modifier une chaîne alors qu'elle travaille sur un clone ?
' il semblerait que VB intervient et remodifie la chaîne d'origine
End Sub
Daniel