Autor Tema: CopyMemory And Array as Variant [Solucionado]  (Leído 2737 veces)

0 Usuarios y 1 Visitante están viendo este tema.

BlackZeroX

  • Bytes
  • *
  • Mensajes: 34
  • Reputación: +4/-1
    • Ver Perfil
CopyMemory And Array as Variant [Solucionado]
« 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!¡.
« última modificación: Agosto 22, 2010, 06:34:47 pm por BlackZeroX »

BlackZeroX

  • Bytes
  • *
  • Mensajes: 34
  • Reputación: +4/-1
    • Ver Perfil
Re:CopyMemory And Array as Variant
« Respuesta #1 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!¡.
« última modificación: Agosto 22, 2010, 06:39:30 pm por BlackZeroX »