Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: BlackZeroX en Agosto 22, 2010, 05:35:36 pm

Título: CopyMemory And Array as Variant [Solucionado]
Publicado por: BlackZeroX en Agosto 22, 2010, 05:35:36 pm
bueno tengo un problema el cual es en este codigo,

1ero copia Todos los bytes adecuadamente, posteriormente al redimencionar y volver a copiar dichos datos en algun indice superior me Crashea si se hace varias veces (Ejecuten en el IDE varias veces y verán) ¬¬"

Código: (Vb) [Seleccionar]


Option Explicit
Option Base 0

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Form_Load()
    Dim VarVariant() As Variant
    Dim VarVariantDest() As Variant
    ReDim VarVariant(3)
    VarVariant(0) = "Miguel"
    VarVariant(1) = "Angel"
    VarVariant(2) = "Ortega"
    VarVariant(3) = "Avila"
    ReDim Preserve VarVariantDest(7)
    CopyMemory ByVal VarPtr(VarVariantDest(4)), ByVal VarPtr(VarVariant(0)), 4 * 16
    Debug.Print VarVariantDest(4)
    Debug.Print VarVariantDest(5)
    Debug.Print VarVariantDest(6)
    Debug.Print VarVariantDest(7)
    ReDim Preserve VarVariantDest(14)
    CopyMemory ByVal VarPtr(VarVariantDest(11)), ByVal VarPtr(VarVariant(0)), 4 * 16
    Debug.Print VarVariantDest(11)
    Debug.Print VarVariantDest(12)
    Debug.Print VarVariantDest(13)
    Debug.Print VarVariantDest(14)
End Sub


Dulces Lunas!¡.
Título: Re:CopyMemory And Array as Variant
Publicado por: BlackZeroX en Agosto 22, 2010, 06:07:14 pm
.
Leyendo un poco llegue a la respuesta, se los dejo por si a alguien le llegase a ocurrir algo similar!¡.

Código: (Vb) [Seleccionar]

Option Explicit
Option Base 0

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SafeArrayAccessData Lib "Oleaut32" _
        (ByVal psa As Long, pvData As Long) As Long
Private Declare Function SafeArrayUnaccessData Lib "Oleaut32" _
        (ByVal psa As Long) As Long
'   //  msvbvm60.DLL
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
    (Var() As Any) As Long
   
Private Sub Form_Load()
    Dim VarVariant()        As Variant
    Dim VarVariantDest()    As Variant
    Dim psa             As Long 'Pointer to SAFEARRAY
    Dim hr              As Long 'HRESULT
    Dim pData           As Long
   
    ReDim VarVariant(3)
    VarVariant(0) = "Miguel"
    VarVariant(1) = "Angel"
    VarVariant(2) = "Ortega"
    VarVariant(3) = "Avila"
   
    CopyMemory psa, ByVal VarPtrArray(VarVariant), 4
    ReDim Preserve VarVariantDest(7)
    hr = SafeArrayAccessData(psa, pData)
    If hr = 0 Then
        CopyMemory VarVariantDest(4), ByVal pData, 4 * 16
        SafeArrayUnaccessData psa
    End If
   
    CopyMemory psa, ByVal VarPtrArray(VarVariant), 4
    ReDim Preserve VarVariantDest(14)
    hr = SafeArrayAccessData(psa, pData)
    If hr = 0 Then
        CopyMemory VarVariantDest(11), ByVal pData, 4 * 16
        SafeArrayUnaccessData psa
    End If
   
    For hr = LBound(VarVariantDest) To UBound(VarVariantDest)
        Debug.Print hr, VarVariantDest(hr)
    Next hr
End Sub


Dulces Lunas!¡.