porque Salida de cadena distinta?

Iniciado por x64core, 24 Octubre 2011, 09:36 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

bueno tengo esa incognita miren estos dos codigos uno devuelve en ANSI y otro en UNICODE porque?
practicamente se hace lo mismo  :-\

Código (VB) [Seleccionar]


' Global
private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)


' CODIGO UNO:

Dim A   As String
Dim B   As Long
Dim C(0 To 20) As Byte

    A = "ABCDE"
    Call CopyMemory(C(0), ByVal A, LenB(A))

   
    For B = 0 To 20
        Debug.Print Chr$(C(B))
    Next

Output:
A
B
C
D
E
NULL
NULL
NULL
...


' CODIGO DOS

Dim A   As String
Dim pA  As Long
Dim B   As Long
Dim C(0 To 20) As Byte

    A = "ABCDE"
    pA = StrPtr(A)
   
    Call CopyMemory(C(0), ByVal pA, LenB(A))

   
    For B = 0 To 20
        Debug.Print Chr$(C(B))
    Next


OUTPUT:
A
NULL
B
NULL
C
NULL
D
NULL
E
NULL
...etc



la unica diferencia es el tipo de variable de la direccion de la cadena
pero aun asi en el primer codigo pasar de tipo String a las API es pasar la direccion ( sistema BSTR )
y en el segundo codigo se obtiene explicitamente primero la direccion y se le pasa la direccion :P
es lo mismo no? :/
pero aun no entiendo porque sale diferente :/

raul338

Uno nunca lo sabrá :xD
Se llama magia entre vb6 y Windows :P

Siempre uso RtlMoveMemory con todos sus parámetros en ByVal y Long, lleno de VarPtr y StrPtr para no tener drama :)


x64core

Cita de: raul338 en 24 Octubre 2011, 10:54 AM
Se llama magia entre vb6 y Windows :P
:xD ... :P vaya vb... ok gracias primo, hermano  ;D

BlackZeroX

Si pasar una varible string directamente se crea otra en su variacion ANSI si pasas el puntero no se toca la string y se toma la original en su Modo Unicode.

como he dicho anteriormente en las declaraciones apis, si alguno de sus parametros requiere una entra de un puntero para entrada/salida de informacion o un buffer, etc, es mejor usar byval...

Dulces Lunas!¡.
The Dark Shadow is my passion.

x64core

suena interesante tio pero me pongo a pensar que el nombre de la variable es en realidad un puntero al buffer
bueno pensandolo bien entonces para las strings y usar APIs hay dos clases de punteros... :P
sino diera error digo :P y los punteros si obtenemos la direccion es distinta :P

BlackZeroX

#5
solo hay punteros y referencias, hay variaciones de puntero a puntero, etc... en las apis ojo.

Es decir, de una manera mas concreta:

* Cuando pasas un puntero se pasa en variacion Unicode (no son punteros es la dirrecion).
* Cuando se pasa por referencia se crea otra cadena en su variacion ANSI...

Dulces Lunas!¡.
The Dark Shadow is my passion.