Como crear Memoria Dinamica?

Iniciado por x64core, 31 Octubre 2011, 19:24 PM

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

x64core

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

BlackZeroX

#1
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 (Vb) [Seleccionar]


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 (vb) [Seleccionar]


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

The Dark Shadow is my passion.

BlackZeroX

Cita de: Raul100 en 31 Octubre 2011, 19:24 PM

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!¡.
The Dark Shadow is my passion.

x64core

Gracias BlackZeroX  ;-) siempre me salvas  ;-)
se me habia ocurrido lo de los arrays tambien ;D

Slek Hacker

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 (vb) [Seleccionar]
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!

BlackZeroX

#5
.
Cita de: Slek Hacker en  3 Noviembre 2011, 21:32 PM
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

Cita de: Slek Hacker en  3 Noviembre 2011, 21:32 PM
¿Para qué sirve exactamente releaseMem?

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

Cita de: Slek Hacker en  3 Noviembre 2011, 21:32 PM
¿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

Cita de: Slek Hacker en  3 Noviembre 2011, 21:32 PM
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!¡.
The Dark Shadow is my passion.

Slek Hacker

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

BlackZeroX

The Dark Shadow is my passion.