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
Ammm se me ocurre ocupar un Array de Bytes y con Redim Preserve y jugar un poco con el puntero de la variable... mira:
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:
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
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!¡.
Gracias BlackZeroX ;-) siempre me salvas ;-)
se me habia ocurrido lo de los arrays tambien ;D
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í?
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!
.
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
000
00000
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 (http://foro.elhacker.net/programacion_visual_basic/mmemory_writeprocessmemoryvbacopybytesrtlmovememory_replacement_noapi-t343343.0.html;msg1680347#msg1680347).
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!¡.
Ok ya lo pillo. Entonces, el +3 ese se podría omitir, y pushear el 10 al principio de los 8 bytes editables no?
si
Dulces Lunas!¡.