MyException - 我的异常网
当前位置:我的异常网» VB » 怎么取得variant内含的数组的首元素的地址

怎么取得variant内含的数组的首元素的地址(4)

www.myexceptions.net  网友分享于:2013-04-10  浏览:3次


Type userVARIANT
    vt              As Integer
    wReserved1      As Integer
    wReserved2      As Integer
    wReserved3      As Integer
    dwReserved1     As Long
    dwReserved2     As Long
End Type

Const VT_BYREF = &H4000

Sub Main()
    Dim arrVar      As Variant
    Dim a()         As Byte
    ReDim a(2)
    Debug.Print Hex(VarPtr(a(0)))

    arrVar = a
    Debug.Print Hex(GetpvData(VarPtr(arrVar)))

    TestByRef a
    TestByVal a
End Sub

Function GetpvData(ByVal pV As Long) As Long
    Dim v           As userVARIANT
    Dim sa          As SafeArray
    Dim pSA         As Long

    CopyMemory v, ByVal pV, Len(v)
    If CBool(v.vt And VT_BYREF) Then
        CopyMemory pSA, ByVal v.dwReserved1, 4
    Else
        pSA = v.dwReserved1
    End If

    CopyMemory sa, ByVal pSA, Len(sa)
    GetpvData = sa.pvData
End Function

Sub TestByRef(ByRef arrVar As Variant)
    Debug.Print Hex(GetpvData(VarPtr(arrVar)))
End Sub

Sub TestByVal(ByVal arrVar As Variant)
    Debug.Print Hex(GetpvData(VarPtr(arrVar)))
End Sub
输出:
3DBCCB0
3DBCCA0
3DBCCB0
3DBCC90

没加容错处理。
------解决方案--------------------

http://www.cnblogs.com/pctgl/articles/1540556.html


获取安全数组信息
 
Des:
获取安全数组的信息,包括安全数组结构内的所有数据
本来用结构做的话,更方便,但会增加代码量,而且用起来也会麻烦些,所以就用了N多变量了
有兴趣的朋友可以再改改

Private Function GetSafeArrayInfo(AnyArray As Variant, Optional sDimension As Integer, Optional LowerBound As Long, Optional UpperBound As Long, Optional Elements As Long, Optional Flags As Integer, Optional cbElements As Long, Optional cLocks As Long, Optional AddressOfData As Long) As Long
'**************************************************************
'*
'*  数组头地址 = GetSafeArrayInfo(数组 ,[维数],[下标],[上标],[元素个数],[属性],[元素长度],[锁定计数],[首元素地址])
'*
'*  result:  成功返回数组头地址;  返回 0 代表这是一个未被初始化过的数组
'*
'*  note:    除第1个参数外,均为输出型参数,要获取数组的什么信息,传入相应的变量,执行后,变量的值即为相应的数组数据
'*
'*           要获取多维数组的非第1维的上/下标,应按照下面的方法调用

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有