elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:12  


Tema destacado: [Overclocking] Récords de overclock del foro

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Como crear Memoria Dinamica?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como crear Memoria Dinamica?  (Leído 952 veces)
RHL


Conectado Conectado

Mensajes: 968


mental


Ver Perfil
Como crear Memoria Dinamica?
« en: 31 Octubre 2011, 19:24 »

bueno tengo esa duda :/
como puedo crear memoria dinamica sin usar apis? :P
es posible? lo normal seria con la virtualAlloc no?
pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por
eso necesitaria crear una variable dinamica porque no sabria si fuera utilizada o no :P
y tambien por la eficiencia ;D
gracias ;D


En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #1 en: 1 Noviembre 2011, 06:49 »

Ammm se me ocurre ocupar un Array de Bytes y con Redim Preserve y jugar un poco con el puntero de la variable... mira:

Código
 
Option Explicit
 
Private Declare Function VarPtrArr Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
 
Public Function allocMem(ByVal lSize As Long) As Long
'   //  Retorna la Dirrecion de un SafeArray.
Dim pBuff()     As Byte
   If (lSize <= &H0) Then Exit Function
   ReDim pBuff(0 To (lSize - 1))
   GetMem4 VarPtrArr(pBuff), VarPtr(allocMem)
   PutMem4 VarPtrArr(pBuff), 0
End Function
 
Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
'   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
Dim pBuff()     As Byte
   PutMem4 VarPtrArr(pBuff), lptr
   If not (lSize = &H0) Then
       ReDim Preserve pBuff(0 To (lSize - 1))
   else
       erase pBuff
   end if
   GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
   PutMem4 VarPtrArr(pBuff), 0
End Function
 
Public Function getMemData(ByVal lptr As Long) As Long
'   //  lPtr debe ser el valor (Address) que retorno en allocMem()/reallocMem().
'   //  Esta funcion retorna la Dirrecion de memoria EDITABLE de lPtr (Dirrecion de un SafeArray).
'   //  Referencias.
'   //  http://msdn.microsoft.com/en-us/library/aa908603.aspx
   If (lptr = &H0) Then Exit Function
   GetMem4 (lptr + &HC), VarPtr(getMemData)    '   //  obtenemos pvData
End Function
 
Public Sub releaseMem(ByVal lptr As Long)
'   //  lPtr debe ser la Dirrecion que retorno en allocMem().
Dim pBuff()     As Byte
   PutMem4 VarPtrArr(pBuff), lptr
End Sub
 
 

ejemplo:

Código
 
Private Sub Form_Load()
Dim lptr    As Long
Dim lVal    As Long
   lptr = allocMem(8)
   PutMem4 getMemData(lptr) + 3, 10
   lptr = reallocMem(lptr, 4)
   GetMem4 getMemData(lptr) + 3, VarPtr(lVal)
   Call releaseMem(lptr)
   Debug.Print lVal
End Sub
 
 


« Última modificación: 4 Noviembre 2011, 03:18 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #2 en: 1 Noviembre 2011, 06:55 »


pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por


para eso tienes el API SysAllocStringByteLen  pero leete la MSDN por que el puntero lo tienes que liberar.

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
RHL


Conectado Conectado

Mensajes: 968


mental


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #3 en: 1 Noviembre 2011, 07:43 »

Gracias BlackZeroX  ;-) siempre me salvas  ;-)
se me habia ocurrido lo de los arrays tambien ;D
En línea
Slek Hacker

Desconectado Desconectado

Mensajes: 29


El Conocimiento nos hace Libres...


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #4 en: 3 Noviembre 2011, 21:32 »

Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)? ¿Para qué sirve exactamente releaseMem?
¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?
Y la función reallocMem, ¿no debería ser así?
Código
Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
'   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
Dim pBuff()     As Byte
   PutMem4 VarPtrArr(pBuff), lptr
   If (lSize = &H0) Then
       Erase pBuff
   Else
       ReDim Preserve pBuff(0 To (lSize - 1))
   End If
   GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
   PutMem4 VarPtrArr(pBuff), 0
End Function

Gracias!
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #5 en: 4 Noviembre 2011, 03:26 »

.
Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)?

long = 4 bytes
integer = 2 bytes

reallocMem solo invoca una redimencion del bloque de memoria es decir hace lo mismo que realloc() de C

¿Para qué sirve exactamente releaseMem?

libera el bloque de memoria. es como free() de C.

¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?

Se reservaron 8 bytes editables allocMem(8).

Entonces getMemData nos retorna el inicio de estos 8 bytes que podemos editar libremente.

00000000

solo me muevo 3 bytes y Pusheo el numero 10 con putmem4() es decir de longitud 4

es decir en estos bytes

00000000

Y la función reallocMem, ¿no debería ser así?

Perdon en lugar de If (lSize = &H0) Then era  If not (lSize = &H0) Then... me falto not...

P.D.: Aqui hay otra forma... con ejemplo a una creacion de String de vb6 con su creacion seteo y liberacion aqui.

Nota: Estos metodos al parecer son mas recomendables para Malware que para un proyecto profesional... aun nunca esta demas meterle algo dificil para que te llamen a solucionar a ti un problema xP... jejejeje.

Dulces Lunas!¡.
« Última modificación: 4 Noviembre 2011, 04:07 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Slek Hacker

Desconectado Desconectado

Mensajes: 29


El Conocimiento nos hace Libres...


Ver Perfil
Re: Como crear Memoria Dinamica?
« Respuesta #6 en: 4 Noviembre 2011, 10:54 »

Ok ya lo pillo. Entonces, el +3 ese se podría omitir, y pushear el 10 al principio de los 8 bytes editables no?
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como crear Memoria Dinamica?
« Respuesta #7 en: 4 Noviembre 2011, 11:18 »

si

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como pedir memoria dinámica para una cadena
Programación C/C++
red_robe 5 2,200 Último mensaje 1 Enero 2006, 22:03
por red_robe
Como crear una matriz dinamica en C.
Programación C/C++
80_andres_80 3 13,433 Último mensaje 2 Noviembre 2008, 17:29
por Spider-Net
Memoria dinamica en dev c++
Programación C/C++
vietnamita 1 2,176 Último mensaje 13 Noviembre 2008, 23:35
por Flakito81
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 433 Último mensaje 21 Octubre 2011, 05:25
por charmedever
Cómo comparar 2 variables en memoria dinamica?
.NET
luison 0 188 Último mensaje 19 Marzo 2012, 20:57
por luison
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines