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

 

 


Tema destacado:


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


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Usar Putmem1 con cadenas?
« Respuesta #10 en: 17 Septiembre 2011, 23:40 pm »

.
Revisa este codigo... te lo acabe de hacer solo para que veas como es una String Unicode en vb6...

En los primeros 4 bytes se almacen la longitud en BYTES de la cadena... despues se empiesan por poner los numeros en ascii de cada letra, separados por el ascii 0 o byte 0, y tengo entendido que la cadena termina con 2 bytes 0 en esto ultimo me puedo equivocar pero no lo creo ya que de lo contrario el api lstrlenW (corrijanme por favor ya que no recuerdo su nombre esactamente), no sabria hasta donde termina dicha cadena en Unicode...

El tipo de string es:  CWSTR

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
  5. Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
  6.  
  7. Private Sub Form_Load()
  8. Dim bStrUnicode(17)     As Byte     '   //  4 bytes (Longitud), Num Caracteres * 2, 2 bytes 0
  9.                                    '   //  (4 + (6*2) + 2) = 18 es decir 0 - 17 dimensiones...
  10. Dim i                   As Long
  11. Dim pStr                As String
  12. Dim lpStrBack           As Long
  13.  
  14.    '   //  Primeros 4 bytes...
  15.    PutMem4 ByVal VarPtr(bStrUnicode(0)), 12
  16.    i = &H4
  17.    '   //  Bytes de los caracteres + su separador...
  18.    bStrUnicode(i) = Asc("M"): bStrUnicode(i + 1) = 0: i = i + &H2
  19.    bStrUnicode(i) = Asc("i"): bStrUnicode(i + 1) = 0: i = i + &H2
  20.    bStrUnicode(i) = Asc("g"): bStrUnicode(i + 1) = 0: i = i + &H2
  21.    bStrUnicode(i) = Asc("u"): bStrUnicode(i + 1) = 0: i = i + &H2
  22.    bStrUnicode(i) = Asc("e"): bStrUnicode(i + 1) = 0: i = i + &H2
  23.    bStrUnicode(i) = Asc("l"): bStrUnicode(i + 1) = 0: i = i + &H2
  24.    '   //  Ultimos 2 bytes infdican el final de la cadena Unicode...
  25.    bStrUnicode(i) = 0: bStrUnicode(i + 1) = 0          '   //  Bytes a mi parecer Obligatorios... corrijanme
  26.  
  27.    pStr = "BlackZeroX"
  28.    GetMem4 ByVal VarPtr(pStr), VarPtr(lpStrBack)       '   //  Repaldo del puntero al bloque...
  29.    MsgBox pStr
  30.    PutMem4 ByVal VarPtr(pStr), VarPtr(bStrUnicode(4))  '   //  Apuntamos al indice 4 de bStrUnicode
  31.    MsgBox pStr
  32.    PutMem4 ByVal VarPtr(pStr), lpStrBack               '   //  Restauramos... es obligatorio o causaria un crash...
  33.    MsgBox pStr
  34.  
  35. End Sub
  36.  
  37.  

en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.

Código
  1.  
  2. Type CWStr
  3.    lLn         As Long     '   // 12. Deben ser igual a la longitud en bytes de bData... (6 * 2)
  4.    bData(11)   As Byte     '   // Miguel; Estas dimenciones dependen de la longitud de la cadena. en este caso es de longitud (6 * 2).
  5.    iEnd        As Integer  '   // Se iguala a 0 para setear el termino de la cadena. integer = 2 bytes...
  6. End Type
  7.  
  8.  

Temibles Lunas!¡.


gracias tio entendi la estructura de las cadenas muy buenos tus codigos aunq al veces me cuesta entenderlos pero los explicas bien ;D
y pues segun que en cada caracter termina con un byte en 0 eso sucede porque el caracter es ascii no?
si fuera algun caracter unicode como una letra japonesa utilizara ese byte no? y el caracter ya no tuviera byte con un 0... ?


1ro:  LPSTR    es una Definicion/Alias de un puntero a una cadena ANSI de PSTR.

2do:
Aun que al final la cadena termina en 2 bytes 0... guiandome en el Alias LPWSTR.
Aun que el tipo correcto de las strings es BSTR.

Dulces Lunas!¡.

EDIT:
estaba incorrecto  ;D


« Última modificación: 18 Septiembre 2011, 00:09 am por Raul100 » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #11 en: 18 Septiembre 2011, 02:45 am »

y pues segun que en cada caracter termina con un byte en 0 eso sucede porque el caracter es ascii no?
si fuera algun caracter unicode como una letra japonesa utilizara ese byte no? y el caracter ya no tuviera byte con un 0... ?

Supongo que si la vdd nunca e usado esos caracteres al 100% ya que no tengo la necesidad... a mi esta estructura en un uso rapido me sirven para manejar rapidamente un split() por caracter... en un array de tipos integer...

Asi como lo hacen en este post... en la funcion IsHour_Psyke12.


Dulces Lunas!¡.


« Última modificación: 18 Septiembre 2011, 03:04 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Usar Putmem1 con cadenas?
« Respuesta #12 en: 18 Septiembre 2011, 02:47 am »

Gracias ;D
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cadenas...
Programación Visual Basic
programatrix 3 2,113 Último mensaje 30 Diciembre 2005, 22:13 pm
por programatrix
Comparar cadenas sin usar strcmp « 1 2 »
Programación C/C++
Rockmore 12 20,649 Último mensaje 25 Octubre 2010, 07:01 am
por do-while
[VB+ASM][SRC] PUTMEMx - PUTMEM1,2,4,8,... [ASM inline]
Programación Visual Basic
x64core 2 2,467 Último mensaje 10 Diciembre 2011, 23:45 pm
por x64core
concatenacion de cadenas sin usar funciones
Programación C/C++
fernaEDLP 2 1,636 Último mensaje 2 Mayo 2019, 13:21 pm
por fernaEDLP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines