修复了vba中用户定义类型的内存分配

时间:2019-06-04 14:10:51

标签: excel vba memory-management user-defined-types

我在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

1 个答案:

答案 0 :(得分:3)

我挑战你的结论。

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 

用户定义类型(UDT)在语言规范中定义为:

  

聚合数据值的线性级联,可能在数据值之间使用实现定义的填充

填充可能会让您失望,但UDT仍然是其成员的线性串联

使用LenB函数来确定成员(或整个UDT)的长度:

Dim foo As ExampleSet
Debug.Print VarPtr(foo), LenB(foo)

如果UDT包含字符串,则需要固定其长度的成员的偏移量,将它们定义为固定长度:

Public Type TestUDT
    SomeString As String * 10
    '...
End Type

也就是说,祝您访问这些指针的过程顺利。