|
162
|
Programación / Programación Visual Basic / Re: [RESUELTO] CopyMem Array VarTypes
|
en: 22 Junio 2013, 02:51 am
|
Gracias por su ayuda, creo que así está bien: Modulo: Option Explicit Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Public Declare Function VirtualProtect Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long Public Const PAGE_EXECUTE_READWRITE As Long = &H40& Public Function GetMem(ByVal lpAddr As Long, ByVal pData As Long, ByVal dlen As Long) As Boolean Dim lngOldProtect As Long If 0 = VirtualProtect(ByVal lpAddr, dlen, PAGE_EXECUTE_READWRITE, lngOldProtect) Then Exit Function End If CopyMemory ByVal pData, ByVal lpAddr, dlen VirtualProtect ByVal lpAddr, dlen, lngOldProtect, lngOldProtect GetMem = True End Function Public Function PutMem(ByVal lpAddr As Long, ByVal pData As Long, ByVal dlen As Long) As Boolean Dim lngOldProtect As Long If 0 = VirtualProtect(ByVal lpAddr, dlen, PAGE_EXECUTE_READWRITE, lngOldProtect) Then Exit Function End If CopyMemory ByVal lpAddr, ByVal pData, dlen VirtualProtect ByVal lpAddr, dlen, lngOldProtect, lngOldProtect PutMem = True End Function
Option Explicit 'http://msdn.microsoft.com/en-us/library/aa263420(v=vs.60).aspx 'http://www.codeguru.com/vb/gen/vb_misc/algorithms/article.php/c7495/How-Visual-Basic-6-Stores-Data.htm 'http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627(v=vs.85).aspx 'http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx 'http://www.roblocher.com/whitepapers/oletypes.aspx Private Sub Form_Load() Dim ESI(3 To 6) As Variant Dim EDI(3 To 6) As Variant Dim i As Byte ESI(3) = "2NE1" '255 '32767 '2147483647 ESI(4) = "CL" ESI(5) = "THE BADDEST FEMALE" ESI(6) = "This is for all my bad girls around the world, Not bad meaning bad but bad meaning good u know, Let’s light it up and let it burn like we don’t care, Let em know how it feels damn good to be bad" 'For i = LBound(ESI) To UBound(ESI) ' MsgBox i & ": " & (ESI(i) = EDI(i)) & vbCrLf & ESI(i) & " = " & EDI(i) & vbCrLf & "ESI: &H" & Hex(VarPtr(ESI(i))) & vbCrLf & "EDI: &H" & Hex(VarPtr(EDI(i))) 'Next i 'Stop 'Call PutMem(VarPtr(EDI(LBound(EDI))), VarPtr(ESI(LBound(ESI))), GetSizeArray(ESI)) Call PutMem(VarPtr(EDI(LBound(EDI))), VarPtr(ESI(LBound(ESI))), GetSizeArray(ESI)) '60 tmb For i = LBound(ESI) To UBound(ESI) MsgBox i & ": " & (ESI(i) = EDI(i)) & vbCrLf & ESI(i) & " = " & EDI(i) & vbCrLf & "ESI: &H" & Hex(VarPtr(ESI(i))) & vbCrLf & "EDI: &H" & Hex(VarPtr(EDI(i))) Next i End End Sub Private Function GetSizeArray(ByRef vArray) Dim BaseBytes As Byte 'MsgBox TypeName(vArray) Select Case TypeName(vArray) Case "Byte()" BaseBytes = 1 Case "Boolean()", "Integer()" BaseBytes = 2 Case "Long()", "Single()" BaseBytes = 4 Case "Double()", "Currency()", "Date()" BaseBytes = 8 Case "Variant()" 'The variant is 16 bytes large. 'It has 2 bytes to describe the type of data it is storing, 6 reserved bytes, and 8 bytes to store the data (each block represents a byte). BaseBytes = 16 Case "String()" BaseBytes = 4 'ReadMem del VarPtr está el Address al string con su len 4 bytes antes End Select GetSizeArray = BaseBytes * (UBound(vArray) - LBound(vArray) + 1) End Function
|
|
|
163
|
Programación / Programación Visual Basic / Re: [AYUDA] CopyMem Array VarTypes
|
en: 18 Junio 2013, 11:46 am
|
Ya la había visto esa página, pero no funciona como dice ahí, ya que el string son 4 bytes, porque hace referencia a un puntero y no a la longitud del mismo, con hacer mov eax, [strvar] está moviendo el puntero del str hacia eax, lo mismo que hace StrPtr supongo.
|
|
|
165
|
Programación / Programación Visual Basic / [RESUELTO] CopyMem Array VarTypes
|
en: 9 Mayo 2013, 21:45 pm
|
Estaba tratando de mover memoria entre arrays. Hice este ejemplo, tal vez puedan mejorarlo y/o ayudame con Variant Modulo: Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Form: Private Sub Form_Load() Dim ESI(3 To 6) As Variant Dim EDI(3 To 6) As Variant ESI(3) = "asdasdasdasdsd12312331231asdasd" '255 '32767 '2147483647 ESI(4) = ESI(3) ESI(5) = ESI(3) ESI(6) = ESI(3) EDI(3) = 0 EDI(4) = EDI(3) EDI(5) = EDI(3) EDI(6) = EDI(3) CopyMemory EDI(LBound(EDI)), ESI(LBound(ESI)), GetSizeArray(ESI) Dim i As Byte For i = LBound(ESI) To UBound(ESI) MsgBox i & ": " & (ESI(i) = EDI(i)) & vbCrLf & "&H" & Hex(VarPtr(ESI(i))) Next i End End Sub Private Function GetSizeArray(ByRef vArray) Dim BaseBytes As Byte 'MsgBox TypeName(vArray) Select Case TypeName(vArray) Case "Byte()" BaseBytes = 1 Case "Boolean()", "Integer()" BaseBytes = 2 Case "Long()", "Single()" BaseBytes = 4 Case "Double()", "Currency()", "Date()" BaseBytes = 8 Case "Variant()" BaseBytes = 0 'DUNNO Case "String()" BaseBytes = 4 'ReadMem del VarPtr está el Address al string con su len 4 bytes antes End Select GetSizeArray = BaseBytes * (UBound(vArray) - LBound(vArray) + 1) End Function
Edit: Se podría tomar como un reto *-)
|
|
|
166
|
Programación / Programación Visual Basic / Re: excluir numeros de la funcion Rnd(x,y)?
|
en: 3 Mayo 2013, 23:54 pm
|
Yo usualmente uso una función que tiene un juego llamado Argentum Online: Public Function RandomNumber(ByVal LowerBound As Long, ByVal UpperBound As Long) As Long 'Initialize randomizer Randomize Timer 'Generate random number RandomNumber = (UpperBound - LowerBound) * Rnd + LowerBound End Function
Se usa como: var = RandomNumber(1,9)
|
|
|
168
|
Programación / Programación C/C++ / [Resuelto] C++ + ASM
|
en: 19 Abril 2012, 05:24 am
|
Hola, en C++ abrí una etiqueta asm como __asm{}, en la cual dentro quise hacer lo siguiente:
__asm { .... //CÓDIGO
mov dword ptr [ebx], RetFakeSinPrologo .... //MÁS CÓDIGO
RetFakeSinPrologo: jmp eax
.... //MÁS CÓDIGO }
En la línea del mov dword obtengo el error: "error C2415: improper operand type", en ASM puedo hacerlo así, acá hay alguna forma de lograr éso?
Desde ya muchas gracias.
|
|
|
169
|
Programación / Programación Visual Basic / Re: [AYUDA] Puntero de controles
|
en: 24 Marzo 2012, 09:31 am
|
En realidad es así, tengo una funcion en VB que tiene 2 parámetros, en un exe que no es mio. El 1er parametro es un RichTextBox, y el 2do es la cadena, en otro lenguaje hice o en uno X (no importa) hice en asm push cadena (por ejemplo) y push PTR, call función, donde el PTR es pasado a la función como ByRef MiRichTextBox As RichTextBox, según por lo que debuguié es:
SUB FUNC(ByRef XXXX As RichTextBox, ByVal Cadena As String)
Entonces necesito el puntero XXXX para que termine de llamar a esa función, pero no encuentro como conseguir ese puntero desde otra aplicacion, me explico?
|
|
|
170
|
Programación / Programación Visual Basic / [AYUDA] Puntero de controles
|
en: 24 Marzo 2012, 08:42 am
|
Hola, yo desde un programa que genero desde 0, he obtenido el puntero de un control, como por ejemplo: Me.Caption = VarPtr(Text1) & " - Hex: " & Hex(VarPtr(Text1)
Pero, lo que quiero hacer es obtener ese mismo puntero desde otro programa, alguien tiene alguna idea de como lo puedo obtener? (También para otros controles). Desde ya muchas gracias.
|
|
|
|
|
|
|