vba 中用户定义类型的固定内存分配
Fixed memory allocation for user defined types in vba
我在 VBA (Excel) 中有一个用户定义的类型,并希望为成员提供固定的内存布局,以便我可以在稍后的步骤中使用指针来访问这些成员。
用户定义的类型看起来像提供的代码,我需要将成员的地址传递给不同的程序。
我原以为 VBA 会按照成员初始化的顺序构造成员,但不知何故却没有。
如果您对如何解决该问题有任何想法,我将不胜感激!
此致,
拉斯
Public Type ExampleSet
Example_P_Anteil As Single
Example_I_Anteil As Single
Example_D_Anteil As Single
Example_v0 As Double
Example_Gang0 As Integer
Example_Beschleunigung As Double
Example_Startzeit As Double
Example_int1 As Integer
Example_int2 As Integer
Example_int3 As Integer
End Type
我质疑你的结论。
Public Type TestUDT
SomeInteger As Integer ' Int16 (I2) at offset 0, padded with 2 bytes
SomeLong As Long ' Int32 (I4) at offset 4, no padding
AnotherLong As Long ' Int32 (I4) at offset 8, no padding
End Type
Public Sub test()
Dim udt As TestUDT
Debug.Print VarPtr(udt) 'expected: X
Debug.Print VarPtr(udt.SomeInteger) 'expected: X+0
Debug.Print VarPtr(udt.SomeLong) 'expected: X+4
Debug.Print VarPtr(udt.AnotherLong) 'expected: X+8
End Sub
输出符合预期:
723094616
723094616
723094620
723094624
User-Defined 类型 (UDT) 在语言规范中定义为:
A linear concatenation of the aggregated data values possibly with implementation defined padding between data values.
填充可能会让您失望,但 UDT 仍然是其成员的线性串联。
使用LenB
函数确定成员(或整个UDT)的长度:
Dim foo As ExampleSet
Debug.Print VarPtr(foo), LenB(foo)
如果UDT包含字符串,定义为fixed-length如果后面的成员的偏移量需要固定:
Public Type TestUDT
SomeString As String * 10
'...
End Type
也就是说,祝你在进程外访问这些指针好运。
我在 VBA (Excel) 中有一个用户定义的类型,并希望为成员提供固定的内存布局,以便我可以在稍后的步骤中使用指针来访问这些成员。
用户定义的类型看起来像提供的代码,我需要将成员的地址传递给不同的程序。
我原以为 VBA 会按照成员初始化的顺序构造成员,但不知何故却没有。
如果您对如何解决该问题有任何想法,我将不胜感激!
此致, 拉斯
Public Type ExampleSet
Example_P_Anteil As Single
Example_I_Anteil As Single
Example_D_Anteil As Single
Example_v0 As Double
Example_Gang0 As Integer
Example_Beschleunigung As Double
Example_Startzeit As Double
Example_int1 As Integer
Example_int2 As Integer
Example_int3 As Integer
End Type
我质疑你的结论。
Public Type TestUDT
SomeInteger As Integer ' Int16 (I2) at offset 0, padded with 2 bytes
SomeLong As Long ' Int32 (I4) at offset 4, no padding
AnotherLong As Long ' Int32 (I4) at offset 8, no padding
End Type
Public Sub test()
Dim udt As TestUDT
Debug.Print VarPtr(udt) 'expected: X
Debug.Print VarPtr(udt.SomeInteger) 'expected: X+0
Debug.Print VarPtr(udt.SomeLong) 'expected: X+4
Debug.Print VarPtr(udt.AnotherLong) 'expected: X+8
End Sub
输出符合预期:
723094616
723094616
723094620
723094624
User-Defined 类型 (UDT) 在语言规范中定义为:
A linear concatenation of the aggregated data values possibly with implementation defined padding between data values.
填充可能会让您失望,但 UDT 仍然是其成员的线性串联。
使用LenB
函数确定成员(或整个UDT)的长度:
Dim foo As ExampleSet
Debug.Print VarPtr(foo), LenB(foo)
如果UDT包含字符串,定义为fixed-length如果后面的成员的偏移量需要固定:
Public Type TestUDT
SomeString As String * 10
'...
End Type
也就是说,祝你在进程外访问这些指针好运。