如何在vba中用VarPtrArray函数获取数组变量的内存地址?

在文章如何在vba中用VarPtr获取变量的内存地址? 一文中介绍了用隐藏的vb函数VarPtr获取变量的起始存储内存地址。

虽然VarPtr函数可以获取数组元素的起始存储内存地址,但是它无法获取数组变量的起始存储内存地址。

数组在vb中是以SAFEARRAY 结构存储的,SAFEARRAY 结构的语法如下:

typedef struct tagSAFEARRAY {
  USHORT         cDims;
  USHORT         fFeatures;
  ULONG          cbElements;
  ULONG          cLocks;
  PVOID          pvData;
  SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY, *LPSAFEARRAY;

其中参数cDims表示数组的维度,cbElements参数表示数组元素的字节大小,pvData参数表示数组的数据。

从SAFEARRAY 结构的语法可以看出,数组变量的起始存储内存地址是不同于数组的第一个元素的存储内存地址的,它还需要存储数组的维度、元素的字节大小等信息。

为此,vb中内置了一个api函数VarPtrArray 可以获取数组变量的起始存储内存地址,也就是SAFEARRAY 结构的内存地址。

在VB中使用VarPtrArray函数前,需要先声明如下:

Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
(Var() As Any) As Long

代码如下:

Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
(Var() As Any) As Long
Sub QQ1722187970()
    Dim i As Long
    i = 1
    '获取变量i的内存地址
    Debug.Print VarPtr(i)
    Dim arr() As Byte
    ReDim arr(1)
    arr(0) = 1
    arr(1) = 2
    '获取第一个数组元素的内存地址
    Debug.Print VarPtr(arr(0))
    '获取数组变量的内存地址
    Debug.Print VarPtrArray(arr)
End Sub
       

发表评论