String 如何在VB6 UDT中以不同方式处理固定和可变长度的Sting?
在VB6中,我可以在UDT中使用固定或可变长度字符串:String 如何在VB6 UDT中以不同方式处理固定和可变长度的Sting?,string,vb6,user-defined-types,String,Vb6,User Defined Types,在VB6中,我可以在UDT中使用固定或可变长度字符串: Public Type MyRecord VariableLengthString As String FixedLengthString As String * 80 End Type 我希望FixedLengthString在UDT中分配160个字节,如果我有这些UDT的数组,则固定长度的字符串数据是内联的 VariableLengthString发生了什么?它是在堆上分配的吗 因此,如果我这样做: Dim recor
Public Type MyRecord
VariableLengthString As String
FixedLengthString As String * 80
End Type
我希望FixedLengthString
在UDT中分配160个字节,如果我有这些UDT的数组,则固定长度的字符串数据是内联的
VariableLengthString
发生了什么?它是在堆上分配的吗
因此,如果我这样做:
Dim record1 As MyRecord
Dim record2 As MyRecord
record1.VariableLengthString = "a"
record2 = record1
record2.VariableLengthString = "b"
。。。显然,record2.VariableLengthString
将是“a”
。但是,如果我这样做:
Dim record1 As MyRecord
Dim record2 As MyRecord
record1.VariableLengthString = "a"
record2 = record1
record2.VariableLengthString = "b"
。。。那么,record1.VariableLengthString
的值是多少
更新:结果仍然是“a”
,这意味着字符串被复制。那么它不在堆上吗
我的测试代码:
record1.VariableLengthString = "a"
record2 = record1
? record2.VariableLengthString
a
record2.VariableLengthString = "b"
? record1.VariableLengthString
a
基本上,“作为字符串”在VB6中分配BSTR。OLE(VB6的底层技术)以特殊方式处理BSTR,包括维护缓存以加快字符串操作。这在MSDN中解释得更详细。UDT指向一个BSTR结构,它基本上是一个32位长度的字段,后跟字符串的字符。它是Unicode感知的。分配给BSTR的空间为4字节+存储字符的字节数。所以它是可变的,而不是固定长度的字符串。这是正确的答案,只要您添加以下内容:虽然BSTR不是不可变的,但在VB6中,字符串可能以不可变的方式运行,因此当您将
record1
复制到record2
时,您就是在复制指针。但是,您可能会将BSTR传递给一个本机函数,该函数可以对其调用SysReAllocString
,或者就地操作它,这将导致修改两个副本。因此,不能保证您不能通过摆弄record2
的字段来损坏record1
的字段。@Scott VB6字符串是不可变的,但没有人会因此而感到困惑。这是因为语言和API的这一领域设计得很好。我从未见过(或听说过)共享同一指针的结构的两个副本有任何奇怪的行为。“本机”函数是指调用Windows API吗?