www.pudn.com > imagescale---raw.zip > BasPtr.bas


Attribute VB_Name = "BasPtr" 
Option Explicit 
 
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 
 
Public Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long 
 
Public Type SAFEARRAY 
    cDims As Integer         '这个数组有几维? 
    fFeatures As Integer     '这个数组有什么特性? 
    cbElements As Long       '数组的每个元素有多大? 
    cLocks As Long           '这个数组被锁定过几次? 
    pvData As Long           '这个数组里的数据放在什么地方? 
    'rgsabound() As SFArrayBOUND 
End Type 
 
Public Type SAFEARRAYBOUND 
    cElements As Long      '这一维有多少个元素? 
    lLbound As Long        '它的索引从几开始? 
End Type 
 
Public Type SAFEARRAY1 
    cDims As Integer         '这个数组有几维? 
    fFeatures As Integer     '这个数组有什么特性? 
    cbElements As Long       '数组的每个元素有多大? 
    cLocks As Long           '这个数组被锁定过几次? 
    pvData As Long           '这个数组里的数据放在什么地方? 
    CE0 As Long              '这一维有多少个元素? 
    LB0 As Long              '它的索引从几开始? 
End Type 
 
Public Type SAFEARRAY2 
    cDims As Integer         '这个数组有几维? 
    fFeatures As Integer     '这个数组有什么特性? 
    cbElements As Long       '数组的每个元素有多大? 
    cLocks As Long           '这个数组被锁定过几次? 
    pvData As Long           '这个数组里的数据放在什么地方? 
    CE0 As Long              '这一维有多少个元素? 
    LB0 As Long              '它的索引从几开始? 
    CE1 As Long 
    LB1 As Long 
End Type 
 
Public Const pvDataPtrAdd As Long = 12& 
 
 
'-- 关键变量 -------------------------------------- 
Public InitPtrFlag As Boolean 
 
Public pLongAll(0 To 0) As Long 
Public pLongAllPtr(0 To 0) As Long 
Public OldpLongAll As Long 
Public OldpLongAllPtr As Long 
 
'-- 2个3Byte指针 ---------------------------------- 
Public p3Byte0(0 To 2) As Byte 
Public p3Byte0Ptr(0 To 0) As Long 
Public Oldp3Byte0 As Long 
Public Oldp3Byte0Ptr As Long 
 
Public p3Byte1(0 To 2) As Byte 
Public p3Byte1Ptr(0 To 0) As Long 
Public Oldp3Byte1 As Long 
Public Oldp3Byte1Ptr As Long 
 
'-- 2个Long指针 ----------------------------------- 
Public pLong0(0 To 0) As Long 
Public pLong0Ptr(0 To 0) As Long 
Public OldpLong0 As Long 
Public OldpLong0Ptr As Long 
 
Public pLong1(0 To 0) As Long 
Public pLong1Ptr(0 To 0) As Long 
Public OldpLong1 As Long 
Public OldpLong1Ptr As Long 
 
 
Public Sub MakePoint(ByVal DataArrPtr As Long, ByVal pDataArrPtr As Long, ByRef OldArrPtr As Long, ByRef OldpArrPtr As Long) 
    Dim TempLng As Long 
    Dim TempPtr As Long 
     
    If InitPtrFlag Then 
        Dim OldPtr As Long 
         
        OldPtr = pLongAllPtr(0) 
        pLongAllPtr(0) = DataArrPtr 
        TempLng = pLongAll(0) + pvDataPtrAdd 
        pLongAllPtr(0) = pDataArrPtr 
        TempPtr = pLongAll(0) + pvDataPtrAdd 
        pLongAllPtr(0) = TempPtr 
        OldpArrPtr = pLongAll(0) 
        pLongAll(0) = TempLng 
        pLongAllPtr(0) = TempLng 
        OldArrPtr = pLongAll(0) 
        pLongAllPtr(0) = OldPtr 
         
    Else 
        CopyMemory TempLng, ByVal DataArrPtr, 4 '得到DataArrPtr的SAFEARRAY结构的地址 
        TempLng = TempLng + pvDataPtrAdd '这个指针偏移12个字节后就是pvData指针 
        CopyMemory TempPtr, ByVal pDataArrPtr, 4 '得到pDataArrPtr的SAFEARRAY结构的地址 
        TempPtr = TempPtr + pvDataPtrAdd '这个指针偏移12个字节后就是pvData指针 
        CopyMemory OldpArrPtr, ByVal TempPtr, 4  '保存旧地址 
        CopyMemory ByVal TempPtr, TempLng, 4  '使pDataArrPtr指向DataArrPtr的SAFEARRAY结构的pvData指针 
        CopyMemory OldArrPtr, ByVal TempLng, 4 '保存旧地址 
         
    End If 
     
End Sub 
 
Public Sub FreePoint(ByVal DataArrPtr As Long, ByVal pDataArrPtr As Long, ByVal OldArrPtr As Long, ByVal OldpArrPtr As Long) 
    Dim TempPtr As Long 
     
    If InitPtrFlag Then 
        pLongAllPtr(0) = DataArrPtr 
        pLongAllPtr(0) = pLongAll(0) + pvDataPtrAdd 
        pLongAll(0) = OldArrPtr 
        pLongAllPtr(0) = pDataArrPtr 
        pLongAllPtr(0) = pLongAll(0) + pvDataPtrAdd 
        pLongAll(0) = OldpArrPtr 
         
    Else 
        CopyMemory TempPtr, ByVal DataArrPtr, 4 '得到DataArrPtr的SAFEARRAY结构的地址 
        CopyMemory ByVal (TempPtr + pvDataPtrAdd), OldArrPtr, 4 '恢复旧地址 
        CopyMemory TempPtr, ByVal pDataArrPtr, 4 '得到pDataArrPtr的SAFEARRAY结构的地址 
        CopyMemory ByVal (TempPtr + pvDataPtrAdd), OldpArrPtr, 4 '恢复旧地址 
         
    End If 
     
End Sub 
 
Public Sub PointInit() 
    If InitPtrFlag Then Exit Sub 
     
    MakePoint VarPtrArray(pLongAll), VarPtrArray(pLongAllPtr), OldpLongAll, OldpLongAllPtr 
    InitPtrFlag = True 
     
    MakePoint VarPtrArray(p3Byte0), VarPtrArray(p3Byte0Ptr), Oldp3Byte0, Oldp3Byte0Ptr 
    MakePoint VarPtrArray(p3Byte1), VarPtrArray(p3Byte1Ptr), Oldp3Byte1, Oldp3Byte1Ptr 
     
    MakePoint VarPtrArray(pLong0), VarPtrArray(pLong0Ptr), OldpLong0, OldpLong0Ptr 
    MakePoint VarPtrArray(pLong1), VarPtrArray(pLong1Ptr), OldpLong1, OldpLong1Ptr 
     
End Sub 
 
Public Sub PointFree() 
    If InitPtrFlag = False Then Exit Sub 
     
    FreePoint VarPtrArray(p3Byte0), VarPtrArray(p3Byte0Ptr), Oldp3Byte0, Oldp3Byte0Ptr 
    FreePoint VarPtrArray(p3Byte1), VarPtrArray(p3Byte1Ptr), Oldp3Byte1, Oldp3Byte1Ptr 
     
    FreePoint VarPtrArray(pLong0), VarPtrArray(pLong0Ptr), OldpLong0, OldpLong0Ptr 
    FreePoint VarPtrArray(pLong1), VarPtrArray(pLong1Ptr), OldpLong1, OldpLong1Ptr 
     
    InitPtrFlag = False 
    FreePoint VarPtrArray(pLongAll), VarPtrArray(pLongAllPtr), OldpLongAll, OldpLongAllPtr 
     
End Sub