一次实验,弄明白了VB6中的字符串的存储格式

本文通过实验揭示了VB6中字符串的存储方式,详细解释了StrPtr()和VarPtr()函数的用法,以及BSTR字符串的UNICODE编码特点。通过对内存的观察,解析了字符串长度和内容的存储位置,帮助读者清晰理解VB6字符串内存布局。

    虽然看过《老兵新传》《VisualBasic win32编程》中介绍VB6字符串的内容,但依旧对VB6中的字符串如何存储不十分清楚,不像对C语言中的字符串那样,在头脑中有一个清晰的轮廓。同时对varptr(),strptr()的理解也只限于书上的那些例子。直到有一天,突然灵光一闪,动手写了下面的程序,当程序执行的结果出现时,我也终于恍然大悟。

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub main()
    Dim strA As String
    strA = "BSTR"
    
    Dim addrofStr As Long
    addrofStr = StrPtr(strA)
    Debug.Print "StrPtr(strA):" & addrofStr
    
    Dim llength As Long
    addrofStr = addrofStr - 4
    CopyMemory llength, ByVal addrofStr, 4 'llength中应为字符串包含的字节数
    Debug.Print "length of bytes:" & llength
    
    Dim addrofVar As Long
    addrofVar = VarPtr(strA)
    Debug.Print "VarPtr(strA):" & addrofVar
    
    Dim addrofTest As Long
    CopyMemory addrofTest, ByVal addrofVar, 4
    Debug.Print "content in addrofVar:" & addrofTest
    
End Sub

'代码运行结果为:
'StrPtr(strA):1909252
'length of bytes:8
'VarPtr(strA):1309648
'content in addrofVar:1909252

    说明:

    1、程序中先声明了一个字符串变量strA,使用StrPtr(strA)取值并保存于long型变量AddrofStr中,该值为:1909252,每次执行这个值会有变化,这是一个32位的地址值,指向存储字符串"BSTR"的内容地址的首字节。

    2、在比这个地址(AddrofStr)小四个字节的地方(AddrofStr-4所指向的地址)存储着"BSTR"的字节数,证明"BSTR"是UNICODE编码,一个字符占两个字节的空间,所以整个字符串的字节数是8。

    3、使用VarPtr(strA)取值保存于long型变量addofVar中,该值为:1309648,这个值是strA变量在内容中的地址,在这个地址中存储的就是真正指向字符串"BSTR"在内存中的首地址,即1909252,验证如下。

    4、取得addrofVar地址中的内容,存储于long型变量addrofTest中,打印出该变量的值,为:1929252,恰好与StrPtr(strA)相等。

    5、程序代码中声明的long型变量在VB6中是32的数据,实际上是用来存储一个32的地址,相当于C语言中的指针。

    6、在copymemory(目的操作数,源操作数,字节数)函数中,对于目的操作数和源操作数,如果使用了“byval 地址”的格式,那么实际上操作的是这个地址中的内容;如果只是“地址”,那么操作的是地址值本身。 

    下面用一张图画出上面的整个过程:


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingdragonfly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值