Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - AlxSpy

#41
CitarByVal 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 (vb) [Seleccionar]


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




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 (vb) [Seleccionar]
Option Explicit

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

Private Sub Command1_Click()
   Dim Icono As Long
   Icono = 64
   Call MessageBox(Form1.hwnd, "Ejemplo", "xD", Icono)
   MsgBox Icono 'muestra el valor a ver si sobreescribio la variable
End Sub


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.
#42
hay la funcion API GetPixel esa es la que debes usar.
#43
Cita de: Tenient101 en 10 Julio 2011, 04:14 AM
http://foro.elhacker.net/programacion_visual_basic/byval_y_byref-t320592.0.html;msg1585427  usa el buscador!  :¬¬

:huh:  
Citarweno 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:

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.
#44
cuando no puedas resolver algo con el vb6 debes averiguar sobre las funciones de windows ( APIs de windows):

Código (vb) [Seleccionar]



'FindWindow: Busca una ventana por su classname o por su windowname(barra de titulo)


Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


'parametros:

'lpClassName: nombre de la clase

'windowname: barra de titulo





'EnumChildWindows: Enumera las ventanas hijas (command, textbox,etc) de una ventana padre.


Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long


'parametros:

'hwndParent: hwnd ventana padre

'lpEnumFunc: direccion de la funcion que recibira los hwnd de las ventanas hijas, por cada ventana hija
           
            encontrada esta llamara a la funcion pasada




'SendMessage: Envia un mensaje a un hwnd (los mensajes son un monton)


Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


'hwnd: hwnd donde se envia el mensaje

'wMsg: mensaje que se va enviar (en este caso WM_GETTEXT)

'wParam: creo que iria el tamaño de la cadena inicializada

'lParam: variable donde se guardara el texto obtenido



Form1:

Código (vb) [Seleccionar]

'agregar estos controles
'1 label con el caption "Titulo Ventana"
'1 textbox (text1) al lado derecho del label
'1 command (command1) debajo del textbox
'1 listbox (list1) al lado derecho del command1

Option Explicit


Private Sub Command1_Click()
   Dim hwnd As Long, Titulo As String
   Titulo = Text1.Text
   'busca la ventana pasandole la barra de titulo
   ' si lo encuentra devolvera el HWND de la ventana ,sino 0
   hwnd = FindWindow(vbNullString, Titulo)
   If hwnd <> 0 Then
       List1.Clear
       Contador = 0
       'enumera las ventanas hijas pasandole el HWND de la ventana padre y la direccion de la funcion
       'que va recibir los HWND de las ventanas hijas (AddressOf EnumChildProc)
       Call EnumChildWindows(hwnd, AddressOf EnumChildProc, ByVal 0&)
   Else
       MsgBox "No se encontro la ventana", vbCritical, ""
   End If
End Sub

Private Sub Form_Load()
   Command1.Caption = "Enumerar Ventanas Hijas"
   Label1.Caption = "Titulo ventana: "
End Sub


en un module bas: module1

Código (vb) [Seleccionar]

Option Explicit

Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


Public Const WM_GETTEXT = &HD

Public Contador As Long

'funcion encargada de recibir cada HWND de las ventanas hijas

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
   Dim Texto As String, Pos As Long
   'crea un espacios de 1000 caracteres para que almacene ahi el texto obtenido
   Texto = Space(1000)
   'aki obtiene el texto del HWND de la ventana hija y lo almacena en variable "Texto"
   Call SendMessage(hwnd, WM_GETTEXT, 1000, ByVal Texto)
   'busca el caracter nulo (este indica el fin de la cadena)
   Pos = InStr(1, Texto, Chr(0))
   'si lo encuentra coge los caracteres excepto el nulo
   If Pos > 0 Then Texto = Left(Texto, Pos - 1)
   'contador para saber el orden de la ventana hija
   Contador = Contador + 1
   'agrega el HWND y el texto de la ventana hija recibida
   Form1.List1.AddItem Contador & "- hWnd Hija: " & hwnd & " / Texto: " & Texto
   EnumChildProc = 1
End Function




con este codigo sabras los HWND de las ventanas hijas y sabras el orden que tiene la ventana de la q kieres obtener el texto, con ese ejempo puedes hacer otro  codigo para que tome el dato que kieres de la ventana hijas que kieres.

para mas info busca info sobre las apis de windows en VB6.
#45
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 (vb) [Seleccionar]
'en el parametro buffer esta sin nada (por ahi lei que si no se indica es ByRef por defecto)


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





Código (vb) [Seleccionar]
'pasa el parametro buffer como byval
Dim Buffer As String
Buffer = Space(5000)
Call ReadProcessMemory(hProcess, Direccion, ByVal Buffer, Len(Buffer), BytesLeidos)


otra api:

Código (vb) [Seleccionar]
'ambas apis son por valor
Private Declare Function FindWindow Lib "user32" _
   Alias "FindWindowA" ( _
       ByVal lpClassName As String, _
       ByVal lpWindowName As String) As Long


Código (vb) [Seleccionar]
'pasa el windowname - titulo sin nada (por defecto seria ByRef)
   Dim Titulo As String
   Titulo = "Google"
   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.
#47
creo que eso del builder es algo relacionado con "stub" que es meter un .exe dentro de otro .exe :

http://foro.elhacker.net/programacion_visual_basic/solucionado_server_builder_vb6-t325338.0.html
#48
claro que busque deberas, los prototipos de apis que se encuentran a monton son los de c++ y visual basic 6.0, mira... la sintaxis de las funciones no es problema sino el como incluir otras apis que no estan incluidas en delphi y sus tipos de datos que manejan porque lo que en C++ es tipo de dato SOCKET en vb6 es long y en delphi vi que es TSocket y ahi es el problemita en que algunos tipos varian, me podrias decir como incluir una funcion api que no esta en delphi? por ejemplo CreateFile no esta directa para usar como si esta MessageBox, o si tuviera que usar alguna funcion de otra dll que no sea de windows como lo haria? en vb6 es sencillo:

private declare function ShowWindowlib "user32" (byval hwnd as long,byval cmdshow as long) as long

private declare function MiFuncion lib "C:\mi Libreria.dll" (parametros as tipo) as tipo

como se haria esto en delphi?


edit:
acabo de ver windows.pas contiene una gran cantidad de funciones y sus librerias y es bastante extenso, podrias dar un ejemplo de como agregar una funcion "X" de una libreria "X" para usarla, con ya eso seria suficiente , ah y que delphi me recomiendas yo recien que inicio en este lenguaje.
#49
hola estoy practicando delphi (el entorno : delphi 7) y pues queria centrarme en el manejo de las apis de windows pero hay poquisima informacion sobre esto , no se si quiizas alguien conosca alguna web/documento donde las expongan (el prototipo algun ejemplo, como declararlas) algo asi como la web y programa "apiguide" de visual basic 6.0 que tiene ufff como 900 apis.
#50
no ps pero con programacion como se haria?
q apis deberia investigar?