VB6中的LSet语句和RSet语句详解
作者:小确幸
时间:2026-06-29
来源:互联网
浏览:0
VB6中LSet用于字符串左对齐,RSet用于右对齐。LSet还能将一种用户定义类型变量复制到另一种类型,执行底层内存拷贝,但此操作极不推荐,因无视类型差异会导致数据损坏或程序崩溃,结果不可预测。
在VB6里,有几个语句长得特别像,容易搞混:Let、Set、LSet、RSet。先看个全家福,心里有个底。

Let是给一般变量赋值的,语法长这样:
[Let] varname = expression大部分情况下,大家都把Let省略了,直接拿等号赋值,以至于不少人压根不知道Let的存在。
Set呢,是给对象赋值的,把变量指向对象,同时增加对象的引用计数。说到引用计数,很多人也是一脸懵。
那LSet是什么?乍一看像是Let和Set的结合体,其实完全不是。LSet里的L是Left的缩写,对应的还有RSet。怎么知道的?文档上写得清楚:
LSet Statement
Left aligns a string within a string variable, or copies a variable of one user-defined type to another variable of a different user-defined type.
RSet Statement
Right aligns a string within a string variable.LSet比RSet多了一个功能,这个咱们先放一边。先看看它俩相同的部分:分别用来把字符串在字符串变量里左对齐或右对齐。啥意思?光看文档确实有点懵,直接跑个测试就明白了:
Sub Main()
Dim url As String
Dim s As String
Let url = "https://www.jb51.net"
s = String$(20, "*")
LSet s = url
Debug.Print s
RSet s = url
Debug.Print s
End Sub输出结果(注意空格):
https://www.jb51.net
https://www.jb51.net确实是左对齐和右对齐,而且它还把原来的星号替换成了空格。说实话,看起来好像真的没什么实际用处,不知道设计者当时是怎么想的。
不过LSet的另一个功能可就厉害了——可以把一个用户定义类型变量复制到另一个用户自定义类型变量。这又是什么意思?
举个例子:IP地址大家都懂吧?比如ping百度返回的IP是61.135.169.125,这格式是给人看的。计算机内部其实拿32位整数来表示IP。怎么用VB把 xxx.xxx.xxx.xxx 格式的IP转成32位整数?Google一番后,你可能写出这样的代码:
Sub Main()
Debug.Print IPToLong("61.135.169.125")
End Sub
Private Function IPToLong(IPStr As String) As Long
Dim Str() As String, HEXStr As String, TempStr As String
Dim x As Long
Str = Split(IPStr, ".")
HEXStr = ""
For x = 0 To UBound(Str)
TempStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
Next x
IPToLong = CLng("&H" & HEXStr)
End Function代码没问题,能正常工作。但用LSet可以写出更“高级”的玩法:
Private Type myBytes
B1 As Byte
B2 As Byte
B3 As Byte
B4 As Byte
End Type
Private Type myLong
Val As Long
End Type
Public Function IP2Long(ip As String) As Long
Dim a() As String
Dim b As myBytes
Dim l As myLong
a = Split(ip, ".")
'注意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
End Function用LSet把myBytes类型的变量直接复制到myLong类型的变量,很好很强大。看看生成的汇编代码:
00401A0E lea eax, dword ptr [ebp-0x20] ; 变量b的地址
00401A11 push eax
00401A12 lea eax, dword ptr [ebp-0x14] ; 变量l的地址
00401A15 push eax
00401A16 push 0x4
00401A18 call __vbaCopyBytes ; jmp to MSVBVM60.__vbaCopyBytes它调用的是MSVBVM60.DLL里的__vbaCopyBytes,第一个参数是要复制的字节数,第二个是目标地址,第三个是源地址,跟C标准库的memcpy类似,只是参数顺序不同。内部实现无非是汇编的串传送指令:
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 shr ecx, 0x2
72A1A108 rep movs dword ptr es:[edi], dword ptr [esi]
72A1A10A mov ecx, eax
72A1A10C mov eax, edx
72A1A10E and ecx, 0x3
72A1A111 rep movs byte ptr es:[edi], byte ptr [esi]
72A1A113 pop edi
72A1A114 pop esi
72A1A115 retn 0xC不过文档里也给了警告:
Warning Using LSet to copy a variable of one user-defined type into a variable of a different user-defined type is not recommended. Copying data of one data type into space reserved for a different data type can cause unpredictable results.
When you copy a variable from one user-defined type to another, the binary data from one variable is copied into the memory space of the other, without regard for the data types specified for the elements.用LSet复制不同类型的用户定义类型变量确实不推荐,可能导致意外结果(比如结构没对齐)。所以,除非你清楚自己在干什么,否则最好别碰LSet这个功能。不过了解它的原理,对深入理解VB底层机制还是挺有帮助的。
作者最新文章
Windows 10
2026-09-16 17:44
Python安装后怎么打开:使用IDLE或命令行启动解释器
2026-09-16 13:54
Windows系统Python安装教程:下载、勾选PATH及环境变量配置
2026-09-16 13:53
“等灯不计时”落地解析:算法善意如何转化为技术能力与生态协同
2026-09-08 18:03
英伟达推出NVHBM:定制HBM带宽提升30%并扩展NVLink Fusion生态
2026-09-08 17:31
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















