elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [SNIPPET-VB6] Guardar/Cargar Estructura
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SNIPPET-VB6] Guardar/Cargar Estructura  (Leído 3,630 veces)
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
[SNIPPET-VB6] Guardar/Cargar Estructura
« en: 28 Noviembre 2010, 13:14 pm »

mStruct:
Código:
Option Explicit

Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, source As Any, ByVal Length As Long) As Long

Private Type SA1D_STRUCT
    Struct(23) As Byte
    bData() As Byte
    Length As Long
End Type

Private SA1D() As SA1D_STRUCT

Public Sub ByteToStruct(ByVal StructPtr As Long, ByRef bArray() As Byte)
    Dim Count As Long
    Dim i As Long
    
    Do
        ReDim Preserve SA1D(i): Call CopyMemory(SA1D(i).Length, bArray(Count), 4)
        ReDim SA1D(i).bData(SA1D(i).Length)
    
        Call CopyMemory(SA1D(i).bData(0), bArray(Count + 4), SA1D(i).Length)
        Count = Count + 4 + SA1D(i).Length: i = i + 1
    Loop Until (UBound(bArray) + 1 = Count)
    
    For i = 0 To UBound(SA1D)
        Call CopyMemory(SA1D(i).Struct(12), VarPtr(SA1D(i).bData(0)), 4) 'DataPtr
        Call CopyMemory(SA1D(i).Struct(16), SA1D(i).Length, 4) 'LBound
        Call CopyMemory(SA1D(i).Struct(0), 1, 2) 'Dims
        Call CopyMemory(SA1D(i).Struct(4), 1, 4) 'ElementSize
              
        Call CopyMemory(ByVal StructPtr + (i * 4), VarPtr(SA1D(i).Struct(0)), 4) 'SA1D Struct
    Next i
End Sub

Public Sub StructToByte(ByVal StructPtr As Long, ByRef bReturn() As Byte, ParamArray VarType() As Variant)
    Dim SafeArrayPtr As Long
    Dim ArrayLength As Long
    Dim ArrayPtr As Long
    Dim i As Long
        
    ReDim bReturn(0)
    For i = 0 To UBound(VarType)
        Select Case VarType(i)
            Case vbByte:
                'SafeArray1D Struct
                Call CopyMemory(SafeArrayPtr, ByVal StructPtr + (i * 4), 4)
                Call CopyMemory(ArrayPtr, ByVal SafeArrayPtr + 12, 4) 'DataPtr
                Call CopyMemory(ArrayLength, ByVal SafeArrayPtr + 16, 4) 'LBound
                'Data Size + Data
                ReDim Preserve bReturn(UBound(bReturn) + 4 + ArrayLength)
                Call CopyMemory(ByVal VarPtr(bReturn(UBound(bReturn) - 4 - ArrayLength)), ArrayLength, 4)
                Call CopyMemory(ByVal VarPtr(bReturn(UBound(bReturn) - ArrayLength)), ByVal ArrayPtr, ArrayLength)
        End Select
    Next i
    ReDim Preserve bReturn(UBound(bReturn) - 1)
End Sub

Ejemplo:
Código:
Private Type dd
    ss() As Byte
    jj() As Byte
    tt() As Byte
End Type

Sub Main()
    Dim told As dd
    Dim tnew As dd
    Dim bB() As Byte
    
    told.ss = StrConv("hola", vbFromUnicode)
    told.jj = StrConv("jeje", vbFromUnicode)
    told.tt = StrConv("wakawaka", vbFromUnicode)
    
    Call StructToByte(VarPtr(told), bB, vbByte, vbByte, vbByte)
    Call ByteToStruct(VarPtr(tnew), bB)
    
    MsgBox StrConv(tnew.jj, vbUnicode)
    MsgBox StrConv(tnew.ss, vbUnicode)
    MsgBox StrConv(tnew.tt, vbUnicode)
End Sub

PD: funciona solo con arrays de bytes, ya que es lo que yo necesito :P, pero se puede agregar "soporte" con otros tipos de variables facilmente  :)

Suerte :-*


« Última modificación: 28 Noviembre 2010, 13:22 pm por F3B14N » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET-VB6] Guardar/Cargar Estructura
« Respuesta #1 en: 28 Noviembre 2010, 21:50 pm »

Al final lo conseguiste :)
A ver si con lo que te dije se puede extener a cualquier estructura ;)


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SNIPPET-VB6] Guardar/Cargar Estructura
« Respuesta #2 en: 28 Noviembre 2010, 21:58 pm »

.
Solo para acompletar un poco te dejo esto que me arme hace tiempo para lo del SafeArray... 1D 2D, 3D.. ND:

Código
  1.  
  2. Private Type SAFEARRAYBOUND
  3.    cElements         As Long
  4.    lLbound           As Long
  5. End Type
  6. Private Type SAFEARRAY_ND
  7.    cDims             As Integer
  8.    fFeatures         As Integer
  9.    cbElements        As Long
  10.    cLocks            As Long
  11.    pvData            As Long
  12.    Bounds()          As SAFEARRAYBOUND
  13. End Type
  14.  
  15.  

Dulce Lunas!¡.
« Última modificación: 28 Noviembre 2010, 22:00 pm por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: [SNIPPET-VB6] Guardar/Cargar Estructura
« Respuesta #3 en: 30 Noviembre 2010, 01:08 am »

Al final lo conseguiste :)
A ver si con lo que te dije se puede extener a cualquier estructura ;)

Lo intenté, te mande un PM hace unos dias con el codigo; la funcion __vbaPutOwner3 recibe directamente el valor de la primer variable de la estructura y no lo demás datos, es raro :S

Como dije, no es difícil agregarle soporte con otros tipos de variables, en unos dias lo hago y posteo  :-X
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
que estructura de datos me recomendais para guardar 70.000 objetos?
Java
kinos 7 4,912 Último mensaje 19 Diciembre 2009, 15:08 pm
por egyware
estructura de datos o fichero para guardar strings, que sea rapida la consulta
Java
kinos 2 4,448 Último mensaje 1 Junio 2010, 20:32 pm
por kinos
Guardar y cargar backup wordpress, no logro conseguirlo...
Bases de Datos
XXXXXX 2 4,495 Último mensaje 19 Diciembre 2010, 15:42 pm
por XXXXXX
Guardar cada línea de un fichero en una estructura
Programación C/C++
NathanD 5 3,889 Último mensaje 6 Marzo 2013, 10:14 am
por leosansan
Leer, Guardar, Cargar .INI
.NET (C#, VB.NET, ASP)
SγиtαxEяяoя 7 5,681 Último mensaje 26 Mayo 2013, 19:39 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines