顾名思义了,这个代码就是将指定的内存地址绑定到一个VB数组,即COM中的SafeArray上。所谓绑定,是指在使用该内存地址之前,并不需要申请相应的本地内存缓冲区,也不需要进行内存复制,只是根据该地址凭空构造一个VB数组,并将数组的真实数据地址指向该地址。当然,该类的功能完全可以用CopyMemory函数直接代替。为什么又写了这个类呢?主要还是为了进一步展示VB中数组的内幕,同时避免在进行大块内存操作时的内存复制,节省内存占用,加快运行速度。该类在VB进行内存搜索等方面的应用上有较好的性能表现。当然,在类中也使用了CopyMemory,但只用来构造数组而已,并没有作大量的数据调动。
好了,废话少好,言归正转,先建一个名为VbArrayPtr的类,代码如下:
代码如下:
Option Explicit
'自定义的数组类型枚举
Public Enum vbArray_Type
vbArrayByte = vbByte Or vbArray '1Bytes
vbArrayInteger = vbInteger Or vbArray '2Bytes
vbArrayLong = vbLong Or vbArray '4Bytes
vbArrayCurrency = vbCurrency Or vbArray '8Bytes
End Enum
Private Type SAFEARRAYBOUND
cElements As Long '这一维有多少个元素?
lLbound As Long '它的索引从几开始?
End Type
Private Const MAX_DIMS = 0 '数组最大维数为1维(下标为0)
Private Type SAFEARRAY '安全数组结构定义
cDims As Integer '维数
fFeatures As Integer '标志
cbElements As Long '单个元素的字节数
clocks As Long '锁定计数
pvData As Long '指向数组元素的指针
rgsabound(MAX_DIMS) As SAFEARRAYBOUND '定义维数边界
End Type
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Const FADF_AUTO = &H1 '