Il existe plusieurs instructions similaires dans VB6 : Let, Set, LSet et RSet.
Let est utilisé pour l'affectation de variables générales :
Copiez le code comme suit :
[Laisser] nomvar = expression
Dans la plupart des cas, nous omettons Let et attribuons des valeurs directement avec le signe égal, de sorte que beaucoup de gens ne connaissent même pas l'existence de Let.
Set est utilisé pour l'affectation d'objets, pointant la variable vers l'objet et augmentant le nombre de références de l'objet. Beaucoup de gens ne savent pas ce qu'est le comptage de références.
Alors, à quoi sert LSet ? À première vue, cela semble être une combinaison de Let et Set, mais ce n'est pas le cas. Le L dans LSet est l’abréviation de Left et son homologue est RLet. Vous me demandez comment je sais que L est l'abréviation de Left ? Ce que dit le document :
Copiez le code comme suit :
Instruction LSet
Aligne à gauche une chaîne dans une variable de chaîne ou copie une variable d'un type défini par l'utilisateur vers une autre variable d'un type défini par l'utilisateur différent.
Instruction RSet
Aligne à droite une chaîne dans une variable de chaîne.
LSet a une fonction de plus que RSet. Ne regardons pas cela d'abord. Regardons d'abord la même partie. Les deux sont utilisés pour aligner une chaîne à gauche (à droite) dans une variable de chaîne. Qu'est-ce que ça veut dire? En fait, je ne le comprends pas simplement en lisant la documentation. Testons-le en pratique :
Copiez le code comme suit :
Sous-principal()
Dim url sous forme de chaîne
Dim s comme chaîne
Soit url = "//www.VeVB.COm"
s = Chaîne$(20, "*")
LSet s = url
Debug.Print s
RSet s = URL
Debug.Print s
Fin du sous-marin
Sortie (notez les espaces) :
Copiez le code comme suit :
//www.VeVB.COm
//www.VeVB.COm
Il est bien aligné à gauche et à droite, et notre astérisque * est remplacé par un espace. A quoi ça sert ? À mon avis, il semble que cela soit vraiment inutile. Je ne sais pas ce qu’en a pensé le concepteur.
Cependant, une autre fonction de LSet est très puissante : elle peut copier une variable de type définie par l'utilisateur vers une autre variable de type définie par l'utilisateur. Qu'est-ce que cela signifie?
Laissez-moi vous donner un exemple. Connaissez-vous l'adresse IP ? L'adresse IP renvoyée par ping sur Baidu est 61.135.169.125. L'adresse IP dans ce format est uniquement destinée à la visualisation humaine. L'adresse IP est en fait représentée par un entier de 32 bits à l'intérieur de l'ordinateur. Comment utiliser VB pour convertir l'adresse IP au format xxx.xxx.xxx.xxx en un entier 32 bits ? Après quelques recherches sur Google, vous pouvez écrire du code similaire à celui-ci :
Copiez le code comme suit :
Sous-principal()
Debug.Print IPToLong("61.135.169.125")
Fin du sous-marin
Fonction privée IPToLong (IPStr As String) As Long
Dim Str() comme chaîne, HEXStr comme chaîne, TempStr comme chaîne
Dim x Aussi longtemps
Str = Diviser(IPStr, ".")
HEXStr = ""
Pour x = 0 Vers UBound(Str)
TempStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
Suivant x
IPVersLong = CLng("&H" & HEXStr)
Fonction de fin
Le code fonctionne bien, il n'y a rien de mal à cela, mais nous pouvons écrire du code plus "avancé" en utilisant l'instruction LSet :
Copiez le code comme suit :
Type privé mes octets
B1 comme octet
B2 comme octet
B3 comme octet
B4 comme octet
Type de fin
Type privé myLong
Val aussi longtemps
Type de fin
'Par Démon
'http://VeVB.COm
Fonction publique IP2Long (ip As String) As Long
Dim a() comme chaîne
Dim b Comme mes octets
Dim l As myLong
a = Split(ip, ".")
'Notez le petit-boutiste
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CByte(a(0))
LSet l = b
IP2Long = l.Val
Fonction de fin
Utilisez LSet pour copier une variable de type myBytes vers une variable de type myLong. C'est très bon et puissant. Jetez un œil au code assembleur généré :
Copiez le code comme suit :
00401A0E lea eax, dword ptr [ebp-0x20] ; adresse de la variable b
00401A11 pousser eax
00401A12 lea eax, dword ptr [ebp-0x14] ; adresse de la variable l ;
00401A15 pousser eax
00401A16 pousser 0x4
00401A18 appelle __vbaCopyBytes ; jmp vers MSVBVM60.__vbaCopyBytes
Ce qu'on appelle __vbaCopyBytes dans MSVBVM60.DLL. Le premier paramètre est l'octet à copier, le deuxième paramètre est l'adresse cible et le troisième paramètre est l'adresse source. Il est similaire à la fonction memcpy de la bibliothèque standard C, sauf que l'ordre des paramètres est différent, et son implémentation interne n'est rien de plus qu'une instruction de transfert de chaîne en assembleur :
Copiez le code comme suit :
72A1A0F3 > mov ecx, dword ptr [esp+0x4]
72A1A0F7 pousser esi
72A1A0F8 mov esi, dword ptr [esp+0x10]
72A1A0FC pousser l'édition
72A1A0FD mov edi, dword ptr [esp+0x10]
72A1A101 mouvement eax,ecx
72A1A103 mov edx, edi
72A1A105 shrecx, 0x2
72A1A108 rep déplace dword ptr es : [edi], dword ptr [esi]
72A1A10A mouvement ecx, eax
72A1A10C mouvement eax, edx
72A1A10E et ecx, 0x3
72A1A111 rep déplace l'octet ptr es : [edi], octet ptr [esi]
72A1A113 pape
72A1A114 pop esi
72A1A115 retn 0xC
A noter que la documentation nous prévient :
Copiez le code comme suit :
Avertissement L'utilisation de LSet pour copier une variable d'un type défini par l'utilisateur dans une variable d'un autre type défini par l'utilisateur n'est pas recommandée. La copie de données d'un type de données dans un espace réservé à un type de données différent peut entraîner des résultats imprévisibles.
Lorsque vous copiez une variable d'un type défini par l'utilisateur vers un autre, les données binaires d'une variable sont copiées dans l'espace mémoire de l'autre, sans tenir compte des types de données spécifiés pour les éléments.
L'utilisation de LSet pour copier des variables de type définies par l'utilisateur n'est pas recommandée et peut conduire à des résultats inattendus (tels que des structures mal alignées). N'utilisez donc pas l'instruction LSet à moins de savoir ce que vous faites.