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

也就是说,祝你在进程外访问这些指针好运。