在VB6 UDT中,固定与可变长度蜇的处理方式有何不同?

时间:2011-03-30 16:07:27

标签: 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 record1 As MyRecord
Dim record2 As MyRecord
record1.VariableLengthString = "a"
record2 = record1

......显然record2.VariableLengthString将是"a"。但是,如果我这样做:

record2.VariableLengthString = "b"

...那么record1.VariableLengthString的价值是什么?

更新:结果仍然是"a",这意味着字符串已被复制。所以它不在堆上吗?

我的测试代码:

record1.VariableLengthString = "a"
record2 = record1
? record2.VariableLengthString
a
record2.VariableLengthString = "b"
? record1.VariableLengthString
a

1 个答案:

答案 0 :(得分:2)

基本上“as string”在VB6中分配BSTR。 OLE(VB6的基础技术)以特殊方式处理BSTR,包括维护缓存以更快地进行字符串操作。 MSDN中的这个article on String Manipulation更详细地解释了它。 UDT指向BSTR结构,该结构基本上是32位长度字段,后跟字符串的字符。它是Unicode识别的。分配给BSTR的空间是4个字节+存储字符的字节数。所以变量不像固定长度字符串那样固定。