Título: Usar Putmem1 con cadenas? Publicado por: x64core en 16 Septiembre 2011, 18:07 pm buenas tengo una duda :P
estoy usando las funciones que vienen internas en vb estoy con putmem1: Código
pues estaba haciendo unas pruebas usando copymemory y se me ocurrio esa funcion con cadenas pero noce si eso es posible ya que me da error este codigo: Código bueno me lanza error de desbordamiento y creo que es porque en el segundo parametro necesito escribir un valor de un byte y estoy intentando escribir 4 bytes :P y no encuntro la forma correcta de hacer lo que quiero :P practicamente lo que quiero es insertar la "Z" en el lugar donde esta "B" con copymemory se hace facil: y lo logro hacer pero se me ocurrio usar esa funcion o noce si esa funcion solamente trabaja con numero :P ya que con valores numericos ya lo hice y funciono y queria usarla con cadenas Código
e probado pasando como segundo parametro el valor propio ( que eso es lo que pide el segundo parametro no? , no el puntero al valor) asi: Código: PutMem1 dirCAD + 1, Valor ' valor = "Z" y tambien pense que era porque necesitaa dos bytes ( "Z" + "\0" ) y use putmem2 pero tampoco bueno en si como se hace correctamente? ;D o definitivamente esas funciones no trabajan con cadenas ? gracias Título: Re: Usar Putmem1 con cadenas? Publicado por: Psyke1 en 16 Septiembre 2011, 21:07 pm Te dejo una tabla de equivalencias.
Código: PutMem1 - Byte - 1 Byte - Byte DoEvents! :P Título: Re: Usar Putmem1 con cadenas? Publicado por: cobein en 16 Septiembre 2011, 22:41 pm Dos acalaraciones, primero los strings son unicode en memoria asi que strptr es el inicio y de ahi en mas la posicion es caracter * 2, el segundo parametro en este caso (asc("Z")) es el byte que vas a poner en la memoria.
Código: Dim CADENA As String Título: Re: Usar Putmem1 con cadenas? Publicado por: BlackZeroX en 16 Septiembre 2011, 23:36 pm .
Cada caracter esta separado por un byte NULO o con valor 0... por ello es mejor usar PutMem2 pero igual y solo quieres hacer alguna otra cosa... Código
@Psyke1 Si usas SysAllocStringLen (http://msdn.microsoft.com/en-us/library/ms891287.aspx) deberas liberar la memoria con SysFreeString (http://msdn.microsoft.com/en-us/library/ms891288.aspx). Dulces Lunas!¡. Título: Re: Usar Putmem1 con cadenas? Publicado por: Psyke1 en 17 Septiembre 2011, 00:35 am @BlackZero
Entonces por esa regla de tres... ¿después de usar Copymemory() deberíamos usar GlobalUnlock() y GlobalFree()? :huh: DoEvents! :P Título: Re: Usar Putmem1 con cadenas? Publicado por: BlackZeroX en 17 Septiembre 2011, 00:42 am .
CopyMemory en ningun momento reserva memoria... solo copia un bloque de bytes a otro bloque... Citando la MSDN de la API SysAllocStringLen Citar If pch is NULL, a string of the requested length is allocated, but not initialized. The pch string can contain embedded null characters and does not need to end with a NULL. Free the returned string later with SysFreeString. Nota: MSDN. P.D.: esta discusion tiene cita a una respuesta que Psyke1 ha borrado... Dulces Lunas!¡. Título: Re: Usar Putmem1 con cadenas? Publicado por: Psyke1 en 17 Septiembre 2011, 00:43 am Ook, muchas gracias, ahora entiendo... ;)
DoEvents! :P Título: Re: Usar Putmem1 con cadenas? Publicado por: x64core en 17 Septiembre 2011, 18:18 pm Dos acalaraciones, primero los strings son unicode en memoria asi que strptr es el inicio y de ahi en mas la posicion es caracter * 2, el segundo parametro en este caso (asc("Z")) es el byte que vas a poner en la memoria. Código: Dim CADENA As String gracias cobein analizando el codigo que pasa con el otro byte? en la funcion asc("Z") el tamaño es de un byte no? el numero que devuelve no es mayor que 255 :P por eso tengo esa duda . Cada caracter esta separado por un byte NULO o con valor 0... por ello es mejor usar PutMem2 pero igual y solo quieres hacer alguna otra cosa... Código
@Psyke1 Si usas SysAllocStringLen (http://msdn.microsoft.com/en-us/library/ms891287.aspx) deberas liberar la memoria con SysFreeString (http://msdn.microsoft.com/en-us/library/ms891288.aspx). Dulces Lunas!¡. gracias BlackZeroX tengo una duda segun lo que dices, e leido que las cadenas para las api se almacenan en formato LPSTR entonces es asi: |H|O|L|A|/0| entonces lo que dices que cada caracter al final tiene un caracter nulo :P no es lo mismo que LPSTR ya que el caracter nulo lo lleva al final de la cadena mas lo que dice cobein que los caracteres se almacenan en memoria en formato Unicode que creo que son 2 bytes y entonces seria mas otro byte del caracter nulo? osea 3 byte :P no entiendo o se me ocurre que el caracter nullo no requiere de ningun byte? o si verdad :P ? Título: Re: Usar Putmem1 con cadenas? Publicado por: BlackZeroX en 17 Septiembre 2011, 22:07 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
en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden. Código
Temibles Lunas!¡. Título: Re: Usar Putmem1 con cadenas? Publicado por: BlackZeroX en 17 Septiembre 2011, 23:13 pm entonces lo que dices que cada caracter al final tiene un caracter nulo :P no es lo mismo que LPSTR ya que el caracter nulo lo lleva al final de la cadena mas lo que dice cobein que los caracteres se almacenan en memoria en formato Unicode que creo que son 2 bytes y entonces seria mas otro byte del caracter nulo? osea 3 byte :P no entiendo o se me ocurre que el caracter nullo no requiere de ningun byte? o si verdad :P ? 1ro: LPSTR es una Definicion/Alias de un puntero a una cadena ANSI de PSTR. 2do: . Cada caracter esta separado por un byte NULO o con valor 0... Aun que al final la cadena termina en 2 bytes 0... guiandome en el Alias LPWSTR (http://msdn.microsoft.com/en-us/library/cc230355%28v=PROT.10%29.aspx). Aun que el tipo correcto de las strings es BSTR (http://msdn.microsoft.com/en-us/library/cc230304%28v=PROT.10%29.aspx). Dulces Lunas!¡. Título: Re: Usar Putmem1 con cadenas? Publicado por: x64core 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
en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden. Código
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 (http://msdn.microsoft.com/en-us/library/cc230355%28v=PROT.10%29.aspx). Aun que el tipo correcto de las strings es BSTR (http://msdn.microsoft.com/en-us/library/cc230304%28v=PROT.10%29.aspx). Dulces Lunas!¡. EDIT: estaba incorrecto ;D Título: Re: Usar Putmem1 con cadenas? Publicado por: BlackZeroX 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 (http://foro.elhacker.net/programacion_visual_basic/reto_ishour-t339058.0.html;msg1663519#msg1663519). Dulces Lunas!¡. Título: Re: Usar Putmem1 con cadenas? Publicado por: x64core en 18 Septiembre 2011, 02:47 am Gracias ;D
|