In VB6 gibt es mehrere ähnlich aussehende Anweisungen: Let, Set, LSet und RSet.
Für die Zuweisung allgemeiner Variablen wird Let verwendet:
Kopieren Sie den Codecode wie folgt:
[Let] varname = Ausdruck
In den meisten Fällen lassen wir Let weg und weisen Werte direkt mit dem Gleichheitszeichen zu, sodass viele Menschen nicht einmal wissen, dass Let existiert.
Set wird für die Objektzuweisung verwendet, um die Variable auf das Objekt zu verweisen und die Referenzanzahl des Objekts zu erhöhen. Viele Leute wissen nicht, was Referenzzählung ist.
Wofür wird LSet verwendet? Auf den ersten Blick scheint es eine Kombination aus Let und Set zu sein, aber das ist nicht der Fall. Das L in LSet ist die Abkürzung für Left und sein Gegenstück ist Rlet. Sie fragen mich, woher ich weiß, dass L die Abkürzung für Left ist? In dem Dokument heißt es:
Kopieren Sie den Codecode wie folgt:
LSet-Anweisung
Linksbündig richtet eine Zeichenfolge innerhalb einer Zeichenfolgenvariablen aus oder kopiert eine Variable eines benutzerdefinierten Typs in eine andere Variable eines anderen benutzerdefinierten Typs.
RSet-Anweisung
Richtet einen String innerhalb einer String-Variablen rechtsbündig aus.
LSet hat eine weitere Funktion als RSet. Schauen wir uns zunächst den gleichen Teil an. Beide werden verwendet, um eine Zeichenfolge nach links (rechts) auszurichten. Was bedeutet es? Tatsächlich verstehe ich es nicht, wenn ich nur die Dokumentation lese. Lassen Sie es uns in der Praxis testen:
Kopieren Sie den Codecode wie folgt:
Sub Main()
URL als String dimmen
Dim s As String
Let url = "//www.VeVB.COm"
s = String$(20, "*")
LSet s = URL
Debug.Print s
RSet s = URL
Debug.Print s
Sub beenden
Ausgabe (Leerzeichen beachten):
Kopieren Sie den Codecode wie folgt:
//www.VeVB.COm
//www.VeVB.COm
Es ist tatsächlich linksbündig und rechtsbündig, und unser Sternchen * wird durch ein Leerzeichen ersetzt. Meiner Meinung nach scheint es wirklich nutzlos zu sein. Ich weiß nicht, was der Designer gedacht hat.
Eine andere Funktion von LSet ist jedoch sehr leistungsfähig: Sie kann eine benutzerdefinierte Typvariable in eine andere benutzerdefinierte Typvariable kopieren. Was bedeutet das?
Lassen Sie mich Ihnen ein Beispiel geben. Kennen Sie die IP-Adresse? Die IP-Adresse, die durch das Anpingen von Baidu zurückgegeben wird, ist 61.135.169.125. Die IP-Adresse in diesem Format ist nur für die menschliche Anzeige bestimmt. Die IP wird tatsächlich durch eine 32-Bit-Ganzzahl im Computer dargestellt. Wie konvertiert man mit VB die IP-Adresse im Format xxx.xxx.xxx.xxx in eine 32-Bit-Ganzzahl? Nach etwas Google können Sie Code wie diesen schreiben:
Kopieren Sie den Codecode wie folgt:
Sub Main()
Debug.Print IPToLong("61.135.169.125")
Sub beenden
Private Funktion IPToLong(IPStr As String) As Long
Dim Str() als String, HEXStr als String, TempStr als String
Dimmen x So lang
Str = Split(IPStr, ".")
HEXStr = ""
Für x = 0 Zu UBound(Str)
TempStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
Nächstes x
IPToLong = CLng("&H" & HEXStr)
Funktion beenden
Der Code funktioniert gut, das ist in Ordnung, aber wir können mit der LSet-Anweisung „fortgeschritteneren“ Code schreiben:
Kopieren Sie den Codecode wie folgt:
Privater Typ myBytes
B1 als Byte
B2 als Byte
B3 als Byte
B4 als Byte
Endtyp
Privater Typ myLong
Val As Long
Endtyp
„Vom Dämon.“
'http://VeVB.COm
Öffentliche Funktion IP2Long(ip As String) As Long
Dim a() als String
Dim b As myBytes
Dim l As myLong
a = Split(ip, ".")
„Beachten Sie Little-Endian
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
Funktion beenden
Verwenden Sie LSet, um eine Variable vom Typ myBytes in eine Variable vom Typ myLong zu kopieren. Es ist sehr gut und leistungsstark. Schauen Sie sich den generierten Assembler-Code an:
Kopieren Sie den Codecode wie folgt:
00401A0E lea eax, dword ptr [ebp-0x20];
00401A11 Push-eax
00401A12 lea eax, dword ptr [ebp-0x14];
00401A15 Push-eax
00401A16 0x4 drücken
00401A18 rufe __vbaCopyBytes auf; jmp an MSVBVM60.__vbaCopyBytes
Der Name lautet __vbaCopyBytes in MSVBVM60.DLL. Der erste Parameter ist das zu kopierende Byte, der zweite Parameter ist die Zieladresse und der dritte Parameter ist die Quelladresse. Dies ähnelt der Memcpy-Funktion in der C-Standardbibliothek. außer dass die Reihenfolge der Parameter unterschiedlich ist und ihre interne Implementierung nichts anderes als Anweisungen zur Zeichenfolgenübertragung in der Assembly ist:
Kopieren Sie den Codecode wie folgt:
72A1A0F3 > mov ecx, dword ptr [esp+0x4]
72A1A0F7 push esi
72A1A0F8 mov esi, dword ptr [esp+0x10]
72A1A0FC Push-Edi
72A1A0FD mov edi, dword ptr [esp+0x10]
72A1A101 mov eax,ecx
72A1A103 mov edx, edi
72A1A105 shrecx, 0x2
72A1A108 rep movs dword ptr es:[edi], dword ptr [esi]
72A1A10A mov ecx, eax
72A1A10C mov eax, edx
72A1A10E und ecx, 0x3
72A1A111 rep movs byte ptr es:[edi], byte ptr [esi]
72A1A113 Papst
72A1A114 pop esi
72A1A115 retn 0xC
Es ist zu beachten, dass die Dokumentation uns warnt:
Kopieren Sie den Codecode wie folgt:
Warnung: Die Verwendung von LSet zum Kopieren einer Variablen eines benutzerdefinierten Typs in eine Variable eines anderen benutzerdefinierten Typs wird nicht empfohlen. Das Kopieren von Daten eines Datentyps in den für einen anderen Datentyp reservierten Bereich kann zu unvorhersehbaren Ergebnissen führen.
Wenn Sie eine Variable von einem benutzerdefinierten Typ in einen anderen kopieren, werden die Binärdaten einer Variablen in den Speicherbereich der anderen kopiert, ohne Rücksicht auf die für die Elemente angegebenen Datentypen.
Die Verwendung von LSet zum Kopieren benutzerdefinierter Typvariablen wird nicht empfohlen und kann zu unerwarteten Ergebnissen (z. B. falsch ausgerichteten Strukturen) führen. Verwenden Sie die LSet-Anweisung daher nicht, es sei denn, Sie wissen, was Sie tun.