มีคำสั่งที่ดูคล้ายกันหลายคำสั่งใน VB6: Let, Set, LSet และ RSet
Let ใช้สำหรับการกำหนดตัวแปรทั่วไป:
คัดลอกรหัสรหัสดังต่อไปนี้:
[ให้] varname = การแสดงออก
ในกรณีส่วนใหญ่ เราละเว้น Let และกำหนดค่าโดยตรงด้วยเครื่องหมายเท่ากับ ทำให้หลายๆ คนไม่รู้ด้วยซ้ำว่ามี Let อยู่ด้วยซ้ำ
Set ใช้สำหรับการกำหนดวัตถุ โดยชี้ตัวแปรไปที่วัตถุ และเพิ่มจำนวนการอ้างอิงของวัตถุ หลายๆ คนไม่รู้ว่าการนับการอ้างอิงคืออะไร
แล้ว LSet ใช้ทำอะไร? เมื่อมองแวบแรกดูเหมือนว่าจะเป็นการผสมผสานระหว่าง Let และ Set แต่ไม่ใช่ L ใน LSet เป็นตัวย่อของ Left และคู่ของมันคือ RLet คุณถามฉันว่ารู้ได้อย่างไรว่า L เป็นตัวย่อของ Left? สิ่งที่เอกสารบอกว่า:
คัดลอกรหัสรหัสดังต่อไปนี้:
คำสั่ง LSet
Left จัดแนวสตริงภายในตัวแปรสตริง หรือคัดลอกตัวแปรประเภทที่ผู้ใช้กำหนดหนึ่งไปยังตัวแปรอื่นประเภทที่ผู้ใช้กำหนดอื่น
คำสั่ง RSet
Right จัดแนวสตริงภายในตัวแปรสตริง
LSet มีฟังก์ชันมากกว่า RSet อย่างหนึ่ง อย่าดูที่ส่วนเดียวกันก่อน ทั้งสองใช้เพื่อจัดแนวสตริงไปทางซ้าย (ขวา) ในตัวแปรสตริง มันหมายความว่าอะไร? ที่จริงแล้วฉันไม่เข้าใจเพียงแค่อ่านเอกสารประกอบเท่านั้น มาทดสอบในทางปฏิบัติกันดีกว่า:
คัดลอกรหัสรหัสดังต่อไปนี้:
หลักย่อย()
Dim url As String
Dim เป็นสตริง
ให้ url = "//www.VeVB.COm"
s = สตริง$(20, "*")
LSet s = url
ดีบัก.พิมพ์
RSet s = url
ดีบัก.พิมพ์
จบหมวดย่อย
เอาต์พุต (สังเกตช่องว่าง):
คัดลอกรหัสรหัสดังต่อไปนี้:
//www.VeVB.COm
//www.VeVB.COm
มันคือการจัดชิดซ้ายและชิดขวา และเครื่องหมายดอกจัน * ของเราถูกแทนที่ด้วยช่องว่าง สิ่งนี้มีประโยชน์อะไร? ในความคิดของฉัน ดูเหมือนว่ามันอาจจะไร้ประโยชน์จริงๆ ฉันไม่รู้ว่าผู้ออกแบบคิดอย่างไร
อย่างไรก็ตาม ฟังก์ชันอื่นของ LSet มีประสิทธิภาพมาก สามารถคัดลอกตัวแปรประเภทที่ผู้ใช้กำหนดไปยังตัวแปรประเภทที่ผู้ใช้กำหนดอื่นได้ สิ่งนี้หมายความว่าอย่างไร?
ฉันขอยกตัวอย่างให้คุณทราบ คุณรู้ที่อยู่ IP หรือไม่? IP ที่ส่งคืนโดยการส่ง Ping ไป่ที่นี่คือ 61.135.169.125 ที่อยู่ IP ในรูปแบบนี้มีไว้สำหรับการดูของมนุษย์เท่านั้น จริงๆ แล้วจะแสดงเป็นจำนวนเต็ม 32 บิตภายในคอมพิวเตอร์ จะใช้ VB เพื่อแปลงที่อยู่ IP ในรูปแบบ xxx.xxx.xxx.xxx เป็นจำนวนเต็ม 32 บิตได้อย่างไร หลังจาก Google บางตัว คุณสามารถเขียนโค้ดที่คล้ายกับสิ่งนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
หลักย่อย()
Debug.พิมพ์ IPToLong("61.135.169.125")
จบหมวดย่อย
ฟังก์ชั่นส่วนตัว IPToLong (IPStr As String) ตราบใดที่
Dim Str() เป็นสตริง, HEXStr เป็นสตริง, TempStr เป็นสตริง
สลัว x ตราบเท่าที่
Str = แยก(IPStr, ".")
HEXStr = ""
สำหรับ x = 0 ถึง UBound(Str)
TempStr = เลขฐานสิบหก(Str(x))
HEXStr = HEXStr & สตริง(2 - Len(TempStr), "0") & TempStr
ถัดไป x
IPToLong = CLng("&H" & HEXStr)
ฟังก์ชันสิ้นสุด
รหัสทำงานได้ดี ไม่มีอะไรผิดปกติ แต่เราสามารถเขียนโค้ด "ขั้นสูง" เพิ่มเติมได้โดยใช้คำสั่ง LSet:
คัดลอกรหัสรหัสดังต่อไปนี้:
ประเภทส่วนตัว myBytes
B1 เป็นไบต์
B2 เป็นไบต์
B3 เป็นไบต์
B4 เป็นไบต์
ประเภทสิ้นสุด
ประเภทส่วนตัว myLong
วาล แอส ลอง
ประเภทสิ้นสุด
'โดยปีศาจ
'http://VeVB.COm
ฟังก์ชั่นสาธารณะ IP2Long (ip As String) ตราบใดที่
Dim a() เป็นสตริง
ติ่มขเป็น myBytes
ติ่มซำเป็น myLong
a = แยก (ip, ".")
'หมายเหตุ ลิตเติ้ลเอนเดียน'
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CByte(a(0))
ลตั้งค่า ล. = ข
IP2Long = l.Val
ฟังก์ชันสิ้นสุด
ใช้ LSet เพื่อคัดลอกตัวแปรประเภท myBytes ไปยังตัวแปรประเภท myLong ซึ่งดีมากและทรงพลัง ดูรหัสแอสเซมบลีที่สร้างขึ้น:
คัดลอกรหัสรหัสดังต่อไปนี้:
00401A0E lea eax, dword ptr [ebp-0x20]; ที่อยู่ของตัวแปร b
00401A11 ดัน eax
00401A12 lea eax, dword ptr [ebp-0x14]; ที่อยู่ของตัวแปร l
00401A15 ดัน eax
00401A16 กด 0x4
00401A18 โทร __vbaCopyBytes ; jmp ถึง MSVBVM60.__vbaCopyBytes
สิ่งที่เรียกว่า __vbaCopyBytes ใน MSVBVM60.DLL พารามิเตอร์แรกคือไบต์ที่จะคัดลอก พารามิเตอร์ที่สองคือที่อยู่เป้าหมาย และพารามิเตอร์ที่สามคือที่อยู่ต้นทาง ซึ่งคล้ายกับฟังก์ชัน memcpy ในไลบรารีมาตรฐาน C ยกเว้นว่าลำดับของพารามิเตอร์แตกต่างกัน และการใช้งานภายในนั้นไม่มีอะไรมากไปกว่าคำแนะนำการถ่ายโอนสตริงในแอสเซมบลี:
คัดลอกรหัสรหัสดังต่อไปนี้:
72A1A0F3 > mov ecx, dword ptr [esp+0x4]
72A1A0F7 พุช esi
72A1A0F8 mov esi, dword ptr [esp+0x10]
72A1A0FC กดแก้ไข
72A1A0FD mov edi, dword ptr [esp+0x10]
72A1A101 mov eax,ecx
72A1A103 mov edx, แก้ไข
72A1A105 เชร็คเอ็กซ์, 0x2
72A1A108 ตัวแทน movs dword ptr es:[edi], dword ptr [esi]
72A1A10A mov ecx, eax
72A1A10C mov eax, edx
72A1A10E และ ecx, 0x3
72A1A111 ตัวแทน movs ไบต์ ptr es: [edi], ไบต์ ptr [esi]
72A1A113 โปเปดี
72A1A114 ป๊อปอัพ
72A1A115 รีเทน 0xC
ควรสังเกตว่าเอกสารเตือนเรา:
คัดลอกรหัสรหัสดังต่อไปนี้:
คำเตือน ไม่แนะนำให้ใช้ LSet เพื่อคัดลอกตัวแปรประเภทหนึ่งที่ผู้ใช้กำหนดลงในตัวแปรประเภทที่ผู้ใช้กำหนดอื่น การคัดลอกข้อมูลประเภทข้อมูลหนึ่งลงในพื้นที่ที่สงวนไว้สำหรับประเภทข้อมูลอื่นอาจทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้
เมื่อคุณคัดลอกตัวแปรจากประเภทที่ผู้ใช้กำหนดไปยังอีกประเภทหนึ่ง ข้อมูลไบนารีจากตัวแปรหนึ่งจะถูกคัดลอกลงในพื้นที่หน่วยความจำของอีกประเภทหนึ่ง โดยไม่คำนึงถึงประเภทข้อมูลที่ระบุสำหรับองค์ประกอบ
ไม่แนะนำให้ใช้ LSet เพื่อคัดลอกตัวแปรประเภทที่ผู้ใช้กำหนด และอาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิด (เช่น โครงสร้างที่ไม่ตรงแนว) ดังนั้นอย่าใช้คำสั่ง LSet เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่