.
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
en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.
Temibles Lunas!¡.
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
Option Explicit 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) Private Sub Form_Load() Dim bStrUnicode(17) As Byte ' // 4 bytes (Longitud), Num Caracteres * 2, 2 bytes 0 ' // (4 + (6*2) + 2) = 18 es decir 0 - 17 dimensiones... Dim i As Long Dim pStr As String Dim lpStrBack As Long ' // Primeros 4 bytes... PutMem4 ByVal VarPtr(bStrUnicode(0)), 12 i = &H4 ' // Bytes de los caracteres + su separador... bStrUnicode(i) = Asc("M"): bStrUnicode(i + 1) = 0: i = i + &H2 bStrUnicode(i) = Asc("i"): bStrUnicode(i + 1) = 0: i = i + &H2 bStrUnicode(i) = Asc("g"): bStrUnicode(i + 1) = 0: i = i + &H2 bStrUnicode(i) = Asc("u"): bStrUnicode(i + 1) = 0: i = i + &H2 bStrUnicode(i) = Asc("e"): bStrUnicode(i + 1) = 0: i = i + &H2 bStrUnicode(i) = Asc("l"): bStrUnicode(i + 1) = 0: i = i + &H2 ' // Ultimos 2 bytes infdican el final de la cadena Unicode... bStrUnicode(i) = 0: bStrUnicode(i + 1) = 0 ' // Bytes a mi parecer Obligatorios... corrijanme pStr = "BlackZeroX" GetMem4 ByVal VarPtr(pStr), VarPtr(lpStrBack) ' // Repaldo del puntero al bloque... MsgBox pStr PutMem4 ByVal VarPtr(pStr), VarPtr(bStrUnicode(4)) ' // Apuntamos al indice 4 de bStrUnicode MsgBox pStr PutMem4 ByVal VarPtr(pStr), lpStrBack ' // Restauramos... es obligatorio o causaria un crash... MsgBox pStr End Sub
en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.
Código
Type CWStr lLn As Long ' // 12. Deben ser igual a la longitud en bytes de bData... (6 * 2) bData(11) As Byte ' // Miguel; Estas dimenciones dependen de la longitud de la cadena. en este caso es de longitud (6 * 2). iEnd As Integer ' // Se iguala a 0 para setear el termino de la cadena. integer = 2 bytes... End Type
Temibles Lunas!¡.
gracias tio entendi la estructura de las cadenas muy buenos tus codigos aunq al veces me cuesta entenderlos pero los explicas bien
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!¡.
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