7,763
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Private Type SAFEARRAY1D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds As SAFEARRAYBOUND
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'Private Declare Sub CopyMemory_VA Lib "kernel32" Alias "RtlMoveMemory" (Destination() As Any, Source As Any, ByVal Length As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
Private Sub Form_Load()
Dim b(100, 100) As Long, tmpArray() As Long
Dim SafeArray As SAFEARRAY1D
Dim i As Long
For i = 0 To 100
b(i, 1) = i
Next
With SafeArray
.cDims = 1
.fFeatures = 0
.cbElements = 1
.cLocks = 0
.pvData = VarPtr(b(0, 1))
.Bounds.lLbound = 0
.Bounds.cElements = 101
End With
'用VA的可以直接傳數組,效率上會高一些,不過不太方便
'CopyMemory_VA tmpArray(), VarPtr(SafeArray), 4
CopyMemory ByVal VarPtrArray(tmpArray()), VarPtr(SafeArray), 4&
subA tmpArray()
CopyMemory ByVal VarPtrArray(tmpArray()), 0&, 4& '還原現場,由於tmpArray()是空數組,所以是0
End Sub
Sub subA(a() As Long)
Dim i As Long, s As String
For i = 0 To UBound(a())
s = s & CStr(a(i)) & " " '不要吐槽&的渣效率,這里只是做個示範而已
Next
MsgBox s
End Sub