String 如何在VB6 UDT中以不同方式处理固定和可变长度的Sting?

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

在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 = "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吗?