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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


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


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Dudas trabajando con memoria VB
« en: 3 Agosto 2011, 21:00 pm »

:P pues si estoy aprendiendo a usar la memoria :P pero ya tengo bastantes dudas :P
bueno tengo un codigo:

Código
  1. Private Type AAA
  2. A1 As Integer
  3. A2 As Integer
  4. A3 As Long
  5. A4 As String
  6. End Type
  7.  
  8. Private Sub Form_Load()
  9. Dim A0 As AAA
  10. Dim dir As Long
  11.  
  12. A0.A2 = 20
  13.  
  14. dir = VarPtr(A0)
  15. dir = dir + 2
  16.  
  17. Debug.Print dir
  18.  
  19. End Sub
  20.  

pues segun lo que e aprendido es una estructura los valores se almacenan en la memoria consecutivamente osea que en esa estructura los valores deberian estar asi:

Código:
                  AAA
   A1    A2   A3   A4
|XXXX|XXXX|XXXXXXX|XX|

sino e aprendido mal la variable interger son 2 bytes, un long son 4 bytes , un string ( en esta no se si estoy en lo corecto :P seguramente no ) son 2 bytes

bueno pues con la funcion varptr obtengo la direccion de la memoria del primer byte de la estructura y comprobar que los datos se almacenan en forma consecutiva quiero obtener el valor de A2 que por eso le asigne el valor de 20
bueno panas creo que ya saben viendo mi codigo que quiero comprobar que quiero aprender y exactamente quiero mostrar el valor 20 ya que segun yo tengo la direccion de memoria . Gracias ;D


« Última modificación: 3 Agosto 2011, 23:38 pm por raul338 » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Dudas trabajando con memoria VB
« Respuesta #1 en: 3 Agosto 2011, 23:32 pm »

un string ( en esta no se si estoy en lo corecto :P seguramente no ) son 2 bytes
Un string son 2 * caracteres + 2 bytes.

Estas usando bien el VarPtr pero no con el Debug.Print porque la variable dir es un Puntero y necesitas leer 2 bytes (que es el tamaño del proximo Integer) y para eso necesitas la api RtlMoveMemory o conocida socialmente como CopyMemory :P


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Dudas trabajando con memoria VB
« Respuesta #2 en: 3 Agosto 2011, 23:49 pm »

:D gracias raul338
ahora comprendo porq la tan famosa copymemory que es con la que se trabaja con la memoria en vb dejo mi enigma resuelto :xD :

Código
  1. Option Explicit
  2.  
  3. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  4.  
  5. Private Type AAA
  6. A1 As Integer
  7. A2 As Integer
  8. A3 As Long
  9. A4 As String
  10. End Type
  11.  
  12. Private Sub Form_Load()
  13. Dim A0 As AAA
  14. Dim dir As Long
  15. Dim destino As Integer
  16.  
  17. A0.A2 = 20
  18.  
  19. dir = VarPtr(A0)
  20. dir = dir + 2
  21.  
  22. CopyMemory ByVal VarPtr(destino), ByVal dir, LenB(dir)
  23. Debug.Print destino
  24.  
  25. End Sub

por cierto algo de informacion trabajando con la memoria en vb? busque en el foro y encontre unos tutos pero no me ayudaron mucho :P muy avanzado creo :P
« Última modificación: 4 Agosto 2011, 03:17 am por raul338 » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Dudas trabajando con memoria VB
« Respuesta #3 en: 4 Agosto 2011, 03:16 am »

Código
  1. dir = VarPtr(A0)
  2. dir = dir + 2
  3.  
  4. CopyMemory ByVal VarPtr(destino), ByVal dir, LenB(dir)
  5.  

Error, dir es Long y lo que queres obtener es Integer, por lo que estas leyendo 4 bytes cuando queres 2. Te da bien porque A0.A3 es 0, sino, te daria cualquier fruta :xD

Sobre tutoriales de ese estilo, no conozco, tampoco es que se use demasiado :xD


PD: Acostumbrate a usar [code=vb][/code] aca :P
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Dudas trabajando con memoria VB
« Respuesta #4 en: 4 Agosto 2011, 07:15 am »

Error, dir es Long y lo que queres obtener es Integer, por lo que estas leyendo 4 bytes cuando queres 2. Te da bien porque A0.A3 es 0, sino, te daria cualquier fruta :xD

Sobre tutoriales de ese estilo, no conozco, tampoco es que se use demasiado :xD


PD: Acostumbrate a usar [code=vb][/code] aca :P

pero... pero si me imprime el numero 20 :P que es lo que queria para comprobar :P
y "dir" es solo una direccion :P
o en que es lo que fallo ??  :-[
« Última modificación: 4 Agosto 2011, 07:18 am por Raul100 » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Dudas trabajando con memoria VB
« Respuesta #5 en: 4 Agosto 2011, 13:58 pm »

La llamada debe ser:

CopyMemory ByVal VarPtr(destino), ByVal dir, 2

Porque vos quereres tener A2, que es un Integer de 2 bytes
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Dudas trabajando con memoria VB
« Respuesta #6 en: 4 Agosto 2011, 18:54 pm »

vale ahora tengo mas dudad  :huh: :P
e probado con eso y pues ahora que veo no importa el numero de bytes que le escriba en el tercer parametro siempre pasa el resultado :P porq? si le agregara mas bytes no estaria accediendo a las demas variables que se encuentran en esa posicion???  :huh:

hice este code:

Código
  1. Option Explicit
  2.  
  3. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  4.  
  5. Private Type AAA
  6. A1 As Integer
  7. A2 As Integer
  8. A3 As Long
  9. A4 As String
  10. End Type
  11.  
  12. Private Sub Form_Load()
  13. Dim A0 As AAA
  14. Dim dir As Long
  15.  
  16. Dim DEST_integer As Integer
  17. dim DEST_long as long
  18. dim DEST_CHAR as string
  19.  
  20.  
  21. A0.a1 = 50
  22. A0.A2 = 20
  23. A0.A3 = 50000
  24. A0.A4 = "R"
  25.  
  26. dir = VarPtr(A0)
  27. dir = dir + XXX
  28.  
  29. CopyMemory ByVal VarPtr(<type DESTINO>), ByVal dir, LEN DE BYTES
  30. Debug.Print destino
  31.  
  32. End Sub

vale espero que me ayuden no podria estar bien y no resuelvo esto :P
pues primero esa duda porq escribiendo cualquier longitud en LEN BYTES( tercer parametro ) el numero de bytes que quiero copiar siempre obtengo el resultado correcto y eso esta bien :xD solo que tengo una duda si agrego mas bytes no estaria dandome una respuesta incorrecta ??? :P

y pues la otra duda :P porq los parametros se pasan por valor? :P porq no da el resultado correcto pasandolos por referencia :P ?

gracias ;D
 
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Dudas trabajando con memoria VB
« Respuesta #7 en: 4 Agosto 2011, 19:25 pm »

El api CopyMemory trabaja con PUNTEROS que es mas rapido, las Referencias usan los punteros al final y ocupan mas Stack ( creo que era este ) y mas espacio en memoria.

Ahora si espesificar X cantidad de Byte´s a leer, este debe ser el Minimo de ambos es decir:

Código
  1.  
  2. funcion min( byval lVal1 as long, byval lVal2 as long )
  3.    if ( lval1 > lval2 ) min = lval2 else min = lval1
  4. end funcion
  5.  
  6. ...
  7. CopyMemory pDest, pSrc, min( DestLen, SrcLen ) // Suponiendo que ya estan declarados los byval en la declaracion API.
  8. ...
  9.  
  10.  

Si se ingresa un valor superior o se escribe en secciones que no pertenecen a X bloque de bytes ya reservados se le llama "Segmentacion de memoria", ya que estas escribiendo en lugares donde NO deberias escribir/leer.

supongamos


Código
  1.  
  2. funcion min( byval lVal1 as long, byval lval2 as long )
  3.    if ( lval1 > lval2 ) min = lval2 else min = lval1
  4. end funcion
  5.  
  6.  
  7. dim iInt as integer
  8. dim lLong as long
  9. '***
  10. CopyMemory varptr(iInt), varptr(lLong), min( lenb(iInt), lenb(lLong) ) '// Correcto
  11. '***
  12. CopyMemory varptr(iInt), varptr(lLong), lenb(lLong) ) '// Incorrecto
  13. ' // Ocaciona una segmentacion de memoria y por ende u Crash, ya que se intentan copiar 4 bytes en un bloque donde caben solo 2 bytes.
  14. '***
  15. 'Alternativas aun mas rapidas:
  16. iInt = lLong and &FFFF '//Correcto
  17. '***
  18. iInt = lLong and &FFFFFFFF '// Incorrecto
  19.  
  20.  

Dulces Lunas!¡.
« Última modificación: 4 Agosto 2011, 19:28 pm por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Dudas trabajando con memoria VB
« Respuesta #8 en: 4 Agosto 2011, 19:34 pm »

BlackZeroX lo explico mejor que yo, ademas de que me trabe al intentar hacer un ejemplo practico :xD
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Dudas trabajando con memoria VB
« Respuesta #9 en: 4 Agosto 2011, 19:35 pm »

gracias BlackZeroX y pues si eso me imaginaba que si se queria acceder a la memoria que no deberia me daria error o me daria un resultado incorrecto :P pero pero con la funcion copymemory en el tercer parametro lo correcto seria 2 bytes que son el integer pero y entonces seria el numero 2! pero si ingreso digamos 4 , 6 ,8 el resultado el correcto siempre :P y no me da error ni valor incorrecto :/
« Última modificación: 4 Agosto 2011, 19:36 pm por raul338 » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Dudas programador Junior . Memoria Ram
Programación General
BgCRaCK 0 1,712 Último mensaje 2 Marzo 2011, 21:12 pm
por BgCRaCK
Dudas sobre memoria fotográfica
Foro Libre
Senior++ 7 2,547 Último mensaje 4 Octubre 2012, 15:31 pm
por Senior++
dudas con memoria no administrada
.NET (C#, VB.NET, ASP)
spiritdead 6 2,929 Último mensaje 9 Noviembre 2012, 22:01 pm
por Keyen Night
dudas memoria
Hardware
javier12 9 3,482 Último mensaje 6 Diciembre 2018, 23:21 pm
por Machacador
dudas memoria ram
Dispositivos Móviles (PDA's, Smartphones, Tablets)
inma55 1 1,790 Último mensaje 1 Mayo 2022, 17:14 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines