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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [DUDA] paso por valor o por referencia (byval/ byref)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA] paso por valor o por referencia (byval/ byref)  (Leído 4,440 veces)
AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
[DUDA] paso por valor o por referencia (byval/ byref)
« en: 10 Julio 2011, 02:32 am »

en varios codigos he visto que al momento de llamar a una funcion los parametros se pasan de manera distinta que la de su declaracion, si un `parametros esta como byref al llamar lo pasan como byval:


Código
  1. 'en el parametro buffer esta sin nada (por ahi lei que si no se indica es ByRef por defecto)
  2.  
  3.  
  4. Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
  5.  
  6.  
  7.  


Código
  1. 'pasa el parametro buffer como byval
  2. Dim Buffer As String
  3. Buffer = Space(5000)
  4. Call ReadProcessMemory(hProcess, Direccion, ByVal Buffer, Len(Buffer), BytesLeidos)

otra api:

Código
  1. 'ambas apis son por valor
  2. Private Declare Function FindWindow Lib "user32" _
  3.    Alias "FindWindowA" ( _
  4.        ByVal lpClassName As String, _
  5.        ByVal lpWindowName As String) As Long

Código
  1. 'pasa el windowname - titulo sin nada (por defecto seria ByRef)
  2.    Dim Titulo As String
  3.    Titulo = "Google"
  4.    Call FindWindow(vbNullString, Titulo)

weno al final cual es el que vale? el ByVal/ByRef indicado en la declaracion de funcion o el ByVal/ByRef usado al momento de llamar a esa funcion?
si pudieran explicarme mejor esto del ByVal/ByRef se los agradeceria .

me lei :
http://foro.elhacker.net/programacion_vb/memoria_en_vb-t114052.0.html
no me kedo muy claro.


« Última modificación: 10 Julio 2011, 02:34 am por alxspy » En línea

Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #1 en: 10 Julio 2011, 02:46 am »

hola, byval es que a la funcion le pasas el valor te tu variable y lo procesas... y byref lo que procesas es la variable, supon que tienes una funcion fun y recibe 1 variable byref, normalmente si despues de invocar la función revisas que valor tiene v, no debería haber cambiado, pues byref si lo hace :P

Código
  1. dim v as string
  2. fun(v)
  3. msgbox v



En línea

Ojo por ojo, y el mundo acabará ciego.
Sanlegas

Desconectado Desconectado

Mensajes: 131


https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-


Ver Perfil
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #2 en: 10 Julio 2011, 04:14 am »

http://foro.elhacker.net/programacion_visual_basic/byval_y_byref-t320592.0.html;msg1585427  usa el buscador!  :¬¬
En línea

AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #3 en: 10 Julio 2011, 22:32 pm »


 :huh:  
Citar
weno al final cual es el que vale? el ByVal/ByRef indicado en la declaracion de funcion o el ByVal/ByRef usado al momento de llamar a esa funcion?

lo que dijo Nakp esta claro.

veo muchos codes que pasan parametros de manera distinta a como lo declaran, ejm: los codes que puse arriba (aqui la duda).

probe a ver q sale quitando los ByVal que tiene el FindWindow:

Código:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (lpClassName As String, ByVal lpWindowName As String) As Long

y pues no logra encontrar la ventana.
weno ahi nomas dejalo ps.
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #4 en: 11 Julio 2011, 05:35 am »


En ese hilo (y en muchos mas buscando :P) explican porque el uso de ByVal y ByRef, en API la mayoria de las variables se pasan por punteros
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #5 en: 11 Julio 2011, 08:01 am »

as Any

no te lo recomiendo en vb6 esta bien pero en la practica es una mala practica, mejor declara TODO como punteros...

byval variable as long

Esto es por que al final practiamente Siempre se termina por obtener el puntero a la variable... ademas evita esos feos Crash que suelen ocurrir sin mera explicacion.

Dulces Lunas!¡.



.
ByVal y Byref esta explicado de alguna manera ante los procesos y funciones personalisados (en la liga y todos han ido directo a este punto mas no al real problema de este hilo, las apis.), es decir, las que creamos o las de vb6 mas no a las APIS, asi que aqui te dejo una explicacion ante esto.:

En las APIS byval y ByRef tienen otra tarea no muy alejada de la que ya se ha explicado, aun que yo recomiendo siempre trabajar con byval ya que al termino se trataran punteros y las referencias pasaran a ser un lobo en la piel de una oveja...

---------->

Puntero/Apuntador --> Es una variable que apunta a la dirrecion de memoria donde se encuentra una dato X.

Las apis no nesesitan crear una Copia de los texto ni nada similar, solo nesesitan el punto de inicio de los datos (puntero), y la longitudad a tratar...

Algunas apis piden referencia?... la referencia esta desde C++ ( en C no he visto una manera de hacer referencia solo con los punteros caso omiso en C++ que esto ya es menos complicado con la referencia, aun que la vdd es la misma borrega solo que con nombre distinto ), pero para ser sincero de alguna manera las referencias terminan a ser punteros.

Cada parametro en el que veas como prefijo "lp" quiere decir que se ESPERAN PUNTEROS. en este caso el api:

Código
  1.  
  2. Declare Function ReadProcessMemory Lib "kernel32" (
  3. ByVal hProcess As Long,    <--- el prefijo "h" indica que se espera un HANDLE.
  4. ByVal lpBaseAddress As Any,  <--- el prefijo "lp" indica que se espera un puntero.
  5. lpBuffer As Any,   <--- el prefijo "lp" indica que se espera un puntero.
  6. ByVal nSize As Long,  <--- el prefijo "n" indica que se espera un entero ( Long(VB6) = int (C)   e int(VB6) = short int(C) ).
  7. lpNumberOfBytesWritten As Long  <--- el prefijo "lp" indica que se espera un puntero.
  8. ) As Long  
  9.  
  10.  

la api es igual a esta que C

Código
  1.  
  2. BOOL WINAPI ReadProcessMemory(
  3.  __in   HANDLE hProcess,
  4.  __in   LPCVOID lpBaseAddress,
  5.  __out  LPVOID lpBuffer,
  6.  __in   SIZE_T nSize,
  7.  __out  SIZE_T *lpNumberOfBytesRead
  8. );
  9.  
  10. /*
  11. __in  <... Esto indica que es un parametro de solo entrada es decir que solo entra pero nada retorna por la misma
  12. __out  <... Esto indica que es un parametro de solo SALIDA o de RETORNO sobre el parametro pero que no le importa lo que tenga anteriormente.
  13. __in y __out, Estos no se escriben aun que podrian representar de alguna manera:
  14. __in = byval
  15. __out = byref
  16. **/
  17.  
  18.  

De hecho es mejor Declarar las apis a conforme a sus prototipos Predefenidos... es decir que la declaracion api deberia ser:

Código
  1.  
  2. Declare Function ReadProcessMemory Lib "kernel32" (
  3. ByVal hProcess As Long, _
  4. ByVal lpBaseAddress As Long, _
  5. ByVal lpBuffer As Long, _
  6. ByVal nSize As Long, _
  7. ByRef lpNumberOfBytesWritten As Long) As Long
  8.  
  9.  

pero como ya dije al final se pasaran lso punteros... es decir que lo correcto deberia de ser:

Código
  1.  
  2. Declare Function ReadProcessMemory Lib "kernel32" (
  3. ByVal hProcess As Long, _
  4. ByVal lpBaseAddress As Long, _
  5. ByVal lpBuffer As Long, _
  6. ByVal nSize As Long, _
  7. Byval lpNumberOfBytesWritten As Long) As Long
  8.  
  9.  

Estos prefijos ( "lp","sz","n","l", ... , "?" , ... ) se les conoce como declaracion hungara ( yo tengo la propia en C pero bueno no es dificil comprenderla en google encuentras un poco de informacion extra ).

Dulces Lunas!¡.
« Última modificación: 11 Julio 2011, 15:28 pm por raul338 » En línea

The Dark Shadow is my passion.
AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #6 en: 11 Julio 2011, 17:57 pm »

Citar
ByVal y Byref esta explicado de alguna manera ante los procesos y funciones personalisados (en la liga y todos han ido directo a este punto mas no al real problema de este hilo, las apis.), es decir, las que creamos o las de vb6 mas no a las APIS, asi que aqui te dejo una explicacion ante esto.:

aja ahi esta el punto, porque si el pasar ByVal a una api fuera nomas para "evitar que la funcion sobreescriba la variable pasada" pues en algunos casos donde iria ByVal supongo que cualquiera de las 2 formas seria valida no?, pues un caso:
suponiendo que quiero usar MessageBox

Código
  1.  
  2. Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
  3.  
  4.  
  5.  

y en el parametro wType (icono a mostrar) NO me interesa si sobreescribe o no la variable asi que lo paso como ByRef:

Código
  1. Option Explicit
  2.  
  3. private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByRef wType As Long) As Long
  4.  
  5. Private Sub Command1_Click()
  6.    Dim Icono As Long
  7.    Icono = 64
  8.    Call MessageBox(Form1.hwnd, "Ejemplo", "xD", Icono)
  9.    MsgBox Icono 'muestra el valor a ver si sobreescribio la variable
  10. End Sub
  11.  

pues al ejecutar no sale el "MessageBox", y el msgbox muestra "64" , pues en este caso la API no sobreescribio la variable y tampoco mostro el mensaje, este tipo de cosas es que generan dudas, supongo que aqui tambien tienne que ver en si la API  porque no sabemos como tratara o que hace con los datos o referencia que le pasamos.
« Última modificación: 11 Julio 2011, 17:59 pm por alxspy » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #7 en: 11 Julio 2011, 21:11 pm »

ammm

http://msdn.microsoft.com/en-us/library/ms645505(v=vs.85).aspx

Código
  1.  
  2. int WINAPI MessageBox(
  3.  __in_opt  HWND hWnd,
  4.  __in_opt  LPCTSTR lpText,
  5.  __in_opt  LPCTSTR lpCaption,
  6.  __in      UINT uType
  7. );
  8.  
  9.  

En ningun lado veo que tenga un parametro de salida...deberias revisar la MSDN antes de hacer algo...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: [DUDA] paso por valor o por referencia (byval/ byref)
« Respuesta #8 en: 12 Julio 2011, 15:45 pm »

ya lo entendi al 100% gracias, y tienes razon el uso del "As Any" es una mala practica, a veces confunde.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ByVal y ByRef
Programación Visual Basic
NaK-32 5 4,130 Último mensaje 27 Febrero 2011, 00:56 am
por NaK-32
Tipos de paso por referencia y paso por referencia de tipo apuntador
Programación C/C++
CATBro 3 3,128 Último mensaje 8 Abril 2012, 08:23 am
por Beakman
Duda en paso de valores por referencia de Java
Java
arts 5 2,731 Último mensaje 25 Octubre 2013, 23:59 pm
por ~ Yoya ~
Duda: Diferencias entre ByVal y ByRef en vb.net
.NET (C#, VB.NET, ASP)
OscarCadenas_91 2 5,140 Último mensaje 26 Junio 2016, 03:10 am
por OscarCadenas_91
Paso por valor y por referencia
Programación C/C++
RiCo9297 1 1,686 Último mensaje 15 Agosto 2016, 17:05 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines