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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


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

Desconectado Desconectado

Mensajes: 47


Ver Perfil
StructToVariant - VariantToStruct
« en: 3 Noviembre 2010, 22:05 pm »

Hola gente, quería pedirle a los coders si se animan a reparar estas simples funciones. Ya que funcionan en local, pero al intentar cargar un variant guardado a una estructura en otro proyecto, da error.

Código:
Private Type ControlVB
    sType As String
    sName As Strin
End Type
Private Declare Function CopyBytes Lib "MSVBVM60" Alias "__vbaCopyBytes" (ByVal Size As Long, Dest As Any, Source As Any) As Long

Private Sub main()
    Dim dd As ControlVB
    Dim bb As ControlVB
    Dim aa As Variant
   
    dd.sName = "aaaaa"
    dd.sType = "TextBox"
   
    aa = StructToVariant(VarPtr(dd), LenB(dd))
    Call VariantToStruct(aa, VarPtr(bb))
   
    MsgBox bb.sName
End Sub

Private Function StructToVariant(ByVal StructPtr As Long, ByVal Size As Long) As Variant
    Dim Bin() As Byte
   
    ReDim Bin(Size)

    Call CopyBytes(Size, ByVal VarPtr(Bin(0)), ByVal StructPtr)
    StructToVariant = Bin
End Function

Private Function VariantToStruct(ByRef vVariant As Variant, ByVal StructPtr As Long)
    Call CopyBytes(LenB(vVariant) - 1, ByVal StructPtr, ByVal StrPtr(vVariant))
End Function

Gracias.


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: StructToVariant - VariantToStruct
« Respuesta #1 en: 4 Noviembre 2010, 09:49 am »

.
Yo personalemente solo cambiaria los punteros hacia las variables... igual no creo que nadie te ayude en la forma que lo pides el susodicho problema...

Dulces Lunas!¡.


En línea

The Dark Shadow is my passion.
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: StructToVariant - VariantToStruct
« Respuesta #2 en: 5 Noviembre 2010, 03:50 am »

.
Yo personalemente solo cambiaria los punteros hacia las variables... igual no creo que nadie te ayude en la forma que lo pides el susodicho problema...

Dulces Lunas!¡.

A que te referís 'en la forma que lo pides el susodicho problema', somos de distintos regiones :P, no en todos los lugares se habla/escribe de la forma que tu tenes incorporada.
No se a que te referís, pero me da la sensación, de que crees que lo pido de mala manera o faltando el respeto :S. Si es así, para nada es esa mi intención, discúlpenme si se mal entiende.

---

BlackZeroX entiendo lo que decís pero, para lo que estoy haciendo, es necesario guardar la estructura, esa estructura esta de ejemplo para que entiendan lo que intento hacer... Y ademas me da curiosidad, debería funcionar, ya que si lo hago con las funciones Get y Put trabajando con binarios, funciona.
El problema esta al sacar los datos de memoria :/

Gracias!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: StructToVariant - VariantToStruct
« Respuesta #3 en: 5 Noviembre 2010, 07:55 am »

.
Susodicho problema es el problema actual expuesto... soy de México y en españa me aprece que usan lo mismo...

mira que no miento:

http://www.wordreference.com/definicion/susodicho
http://www.google.com.mx/search?q=Susodicho+&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-MX:official&client=firefox-a.

Ahora ya vi mejor el codigo solo te dire que las variables de tipo string u otras tienden a tener constructores o similares esto por el SafeArray de VB6, aun no lo confirmo pero lo que si te puedo decir es que como estas COPIANDO solo los punteros al termino del proceso la variable N es destruida y como la variable Z tiene el mismo puntero intentara destruir algo que ya esta destruido, esto es con esactitud uno de los problemas que yo tube hace tiempo... lo resolvi cambiando punteros entre variables (  SwapPtr()  ); aun que viendolo mejor no es el mismo problema ya que la funcion StructureToVariant solo retorna un tipo de variable Array de byte, aun que se intento hacer algo similar...

Ahora TODO el codigo esta mal... la forma mas facil de pasar una variable "Struture" a un tipo "Variant" es esta

Código
  1.  
  2. VariableVariant = VarianbleStructure
  3.  
  4.  

y viseversa (Solo del mismo tipo OJO con eso)

y para cambiar un puntero de variable por otra  puedes usar esta funcion que me hice para evitar un tipo crash con destruccion de variables al finalizar el proceso...

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)
  5.  
  6. Public Sub SwapPtr(ByVal lngPtrOne As Long, ByVal lngPtrTwo As Long, Optional LenOFStructure As Long = 4)
  7. If LenOFStructure < 1 Then Exit Sub
  8. Dim Byt_Bytes()                     As Long
  9.    ReDim Byt_Bytes(1 To LenOFStructure)
  10.    Call CopyMemory(ByVal VarPtr(Byt_Bytes(1)), ByVal lngPtrOne, LenOFStructure)
  11.    Call CopyMemory(ByVal lngPtrOne, ByVal lngPtrTwo, LenOFStructure)
  12.    Call CopyMemory(ByVal lngPtrTwo, ByVal VarPtr(Byt_Bytes(1)), LenOFStructure)
  13. End Sub
  14.  
  15.  

Dulces Lunas!¡.
« Última modificación: 5 Noviembre 2010, 08:16 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: StructToVariant - VariantToStruct
« Respuesta #4 en: 13 Noviembre 2010, 00:46 am »

Gracias por interesarte y ayudarme BlackZeroX  ;-)
Pero no era eso, sino que, el problemín es la funcion Len() de VB6 que devuelve el tamaño de la estructura erroneamente  :-\.

Con este ejemplo lo pueden confirmar:

Código:
Private Type st
    ss As String
    ll As Long
End Type

Private Sub Form_Load()
    Dim stt As st
    stt.ss = "aaaaaa"
    stt.ll = 500
    MsgBox Len(stt)
    End
End Sub

Si cambian el "a.." por algo mas/menos largo, el retorno de Len() vá a ser el mismo siempre... y ese es el problema para pasar la estructura a un array byte.

Si alguien supiera como solucionar esto, estaria COMPLETAMENTE agradecio si me ayudaran a resolver el problemita.

Gracias!
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: StructToVariant - VariantToStruct
« Respuesta #5 en: 13 Noviembre 2010, 02:29 am »

Las estructuras deben tener un tamaño fijo, esto queire decir que si utilizas string vas a tener que darle una dimencion

Private Type st
    ss As String * 50
    ll As Long
End Type


de todas formas "creo" que aveces esto puede no funcionar, no recuerdo si era porque mesclaba integer, pero no me funciono.

creo que lo mas adecuado seria utilizar array de bits,

Private Type st
    tamañocadena as long
    cadena() as byte
    otracosa As Long
End Type


entonces en tamañocadena pones la dimencion del array de cadena().

bue nose igual proba con lo otro primero.

saludos.
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: StructToVariant - VariantToStruct
« Respuesta #6 en: 13 Noviembre 2010, 02:37 am »

Las estructuras deben tener un tamaño fijo, esto queire decir que si utilizas string vas a tener que darle una dimencion

Private Type st
    ss As String * 50
    ll As Long
End Type


de todas formas "creo" que aveces esto puede no funcionar, no recuerdo si era porque mesclaba integer, pero no me funciono.

creo que lo mas adecuado seria utilizar array de bits,

Private Type st
    tamañocadena as long
    cadena() as byte
    otracosa As Long
End Type


entonces en tamañocadena pones la dimencion del array de cadena().

bue nose igual proba con lo otro primero.

saludos.

Si, es cierto al darle las dimensiones funciona sin problemas, pero en ambos casos Strings o ByteArrays, sucede lo mismo al dejarlos dinamicos :/
Se me ocurre hacer una funcion que busque a partir del puntero que se le pasa, "el prototipo de cierre de un structure" osea "las instrucciones", voy a investigar un poco aver si logro algo :P
Ojala alguno de los expertos que rondan por aca me ayuden :A

Gracias
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: StructToVariant - VariantToStruct
« Respuesta #7 en: 13 Noviembre 2010, 03:34 am »


EDITO IMPORTANTE:

OJO en una structura donde aya Strings, Arragles o similares que no tengan longitud de bites definidos previamente se sustituyen con el puntero hacia otra parte de la memoria es decir que se sustituyen por 4 bytes en cada uno donde aparezca (Punteros <<Long>>),

Código
  1.  
  2. Private Type st
  3.    ss As String
  4.    ll As Long
  5. End Type
  6.  
  7.  

Son 8 bytes por que? sencillo mira

4 bytes de puntero a la estructura de 8 bytes que contiene a si ves los punteros a los elementos de la estructura es decir:

Código
  1.  
  2. Dim a as st  
  3. dim lng_ptr as long
  4.  
  5. lng_ptr = Varptr(a)  ' <--- Puntero a la estructura es decir 4 bytes de tipo long
  6.  
  7.  

ese puntero ( el almacenado en -> lng_ptr) apunta a el puntero del inicio de tu estructura donde hay

4 bytes del String (Puntero)
4 bytes del tipo long (No es un putero ya es la variable)

= 12 bytes + los bytes a donde apuntan los 4 del string

Es decir Len() esta haciendo correctamente su trabajo... solo que actua de esta manera como lenb()

.

gracias a esto la estructura tiene un tamaño fijo y cada elemento es un apuntador (para los string u otros que no sean numeros), por lo tanto si quieres leer algo de X elemento y cambiar a otra estructura o variable etc puedes obtener esos 4 bytes del string e intercambiarlos con los de otra variable string o dentro de otra estructura de distinto tipo

Ejemplo:

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Type Estruct1
  5.    st1 As String
  6.    in1 As Long
  7.    st2 As String
  8. End Type
  9.  
  10. Private Type Estruct2
  11.    st1 As String
  12.    in1 As Long
  13.    st2 As String
  14.    in2 As Long
  15.    st3 As String
  16. End Type
  17.  
  18. Private Sub Form_Load()
  19. Dim st1 As Estruct1
  20. Dim st2 As Estruct2
  21. Dim S   As String
  22.  
  23.    S = "BlackZeroX"
  24.    st1.st1 = "infrangelux"
  25.    Call SwapPtr(VarPtr(S), VarPtr(st1.st1), 4)
  26.    Call SwapPtr(VarPtr(st1.st1), VarPtr(st2.st3), 4)
  27.    MsgBox S
  28.    MsgBox st1.st1
  29.    MsgBox st2.st3
  30. End Sub
  31.  
  32.  

en un modulo cualquiera...

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)
  5.  
  6. Public Sub SwapPtr(ByVal lngPtrOne As Long, ByVal lngPtrTwo As Long, Optional LenOFStructure As Long = 4)
  7. If LenOFStructure < 1 Then Exit Sub
  8. Dim Byt_Bytes()                     As Long
  9.    ReDim Byt_Bytes(1 To LenOFStructure)
  10.    Call CopyMemory(ByVal VarPtr(Byt_Bytes(1)), ByVal lngPtrOne, LenOFStructure)
  11.    Call CopyMemory(ByVal lngPtrOne, ByVal lngPtrTwo, LenOFStructure)
  12.    Call CopyMemory(ByVal lngPtrTwo, ByVal VarPtr(Byt_Bytes(1)), LenOFStructure)
  13. End Sub
  14.  
  15.  

Dulces Lunas!¡.
« Última modificación: 13 Noviembre 2010, 04:22 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: StructToVariant - VariantToStruct
« Respuesta #8 en: 13 Noviembre 2010, 03:54 am »

.
Mas claro aqui lo dejo explicado:

Código
  1. Private Type st
  2.    ss As String
  3.    ll As Long
  4. End Type
  5.  
  6. Private Sub Form_Load()
  7.    Dim stt As st
  8.    '   //  [ stt.ss ] Cada caracter esta separado por un "chr(0)" y _
  9.     solo por esto cada caracter = 2 bytes en este caso son 12 bytes
  10.    stt.ss = "aaaaaa"
  11.    stt.ll = 500
  12.    '   //  [ len() ] La estructura consta de 2 parametros por asi decirlo _
  13.     y uno de ellos es Un "String" de longitud No declarada _
  14.     entonces esto significa que en ese lugar hay Un puntero a el primer digito _
  15.     de la "string" es decir en otra parte de la memoria esta la "String". _
  16.     mientras que el tipo "long" ya se sabe que son 4 bytes por ende No se _
  17.     nesesita crear en otra parte es decir son 8 bytes de la estructura _
  18.     y solo uno de los campos es "String" de longitud NO DECLARADA _
  19.     por ende es creado en otra parte, y sustituido po su puntero al mismo!&#161;.
  20.    MsgBox Len(stt) + LenB(stt.ss) - 4  '   //  El 4 es el puntero al string
  21.    '   //  (4 bytes = long) +  LenB(stt.ss) = bytes Reales
  22.    '   //  Es decir en este caso: _
  23.     4 + 6*2 -4  ( ya que el primer 4 es long, El 6*2 es que son 4 caracteres pero cada _
  24.     caracter termina por Until chr(0) por eso es por 2 ) y el -4 es el puntero Dela estructura.
  25. End Sub
  26.  
  27.  

Dulces Lunas!¡.
« Última modificación: 13 Noviembre 2010, 04:04 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: StructToVariant - VariantToStruct
« Respuesta #9 en: 13 Noviembre 2010, 04:20 am »

Perfecto ahora si entendí como funciona, muchas gracias!   :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines