Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: x64core en 24 Octubre 2011, 09:36 am



Título: porque Salida de cadena distinta?
Publicado por: x64core en 24 Octubre 2011, 09:36 am
bueno tengo esa incognita miren estos dos codigos uno devuelve en ANSI y otro en UNICODE porque?
practicamente se hace lo mismo  :-\

Código
  1.  
  2. ' Global
  3. private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  4.  
  5.  
  6. ' CODIGO UNO:
  7.  
  8. Dim A   As String
  9. Dim B   As Long
  10. Dim C(0 To 20) As Byte
  11.  
  12.    A = "ABCDE"
  13.    Call CopyMemory(C(0), ByVal A, LenB(A))
  14.  
  15.  
  16.    For B = 0 To 20
  17.        Debug.Print Chr$(C(B))
  18.    Next
  19.  
  20. Output:
  21. A
  22. B
  23. C
  24. D
  25. E
  26. NULL
  27. NULL
  28. NULL
  29. ...
  30.  
  31.  
  32. ' CODIGO DOS
  33.  
  34. Dim A   As String
  35. Dim pA  As Long
  36. Dim B   As Long
  37. Dim C(0 To 20) As Byte
  38.  
  39.    A = "ABCDE"
  40.    pA = StrPtr(A)
  41.  
  42.    Call CopyMemory(C(0), ByVal pA, LenB(A))
  43.  
  44.  
  45.    For B = 0 To 20
  46.        Debug.Print Chr$(C(B))
  47.    Next
  48.  
  49.  
  50. OUTPUT:
  51. A
  52. NULL
  53. B
  54. NULL
  55. C
  56. NULL
  57. D
  58. NULL
  59. E
  60. NULL
  61. ...etc
  62.  
  63.  

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 :/


Título: Re: porque Salida de cadena distinta?
Publicado por: raul338 en 24 Octubre 2011, 10:54 am
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 :)



Título: Re: porque Salida de cadena distinta?
Publicado por: x64core en 24 Octubre 2011, 14:07 pm
Se llama magia entre vb6 y Windows :P
:xD ... :P vaya vb... ok gracias primo, hermano  ;D


Título: Re: porque Salida de cadena distinta?
Publicado por: BlackZeroX en 24 Octubre 2011, 20:04 pm
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!¡.


Título: Re: porque Salida de cadena distinta?
Publicado por: x64core en 24 Octubre 2011, 20:07 pm
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


Título: Re: porque Salida de cadena distinta?
Publicado por: BlackZeroX en 24 Octubre 2011, 20:10 pm
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!¡.