Resumen Envío de mensajes entre aplicaciones   (2 mensajes )

Mensaje enviado por "Mauricio Pinto" <mpinto@netnow.cl>


Para poder enviar información entre aplicaciones, los pasos que se deben realizar son :

  Obtener el manejador de la ventana de la aplicación destino.(si no sabes como hacerlo, te puedo ayudar, no lo hago aquí para no salirme del tema central)

  Se envía el mensaje "WM_COPYDATA" con SendMessage utilizando el manejador anterior.

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

(Se utiliza para enviar mensajes a ventanas o controles que tienen un numero manejador, por ejemplo hay un mensaje que se le puede enviar a los combos para que se abran o contraigan, sin que se les tenga que pinchar el botón con la flecha ).

  Con el SendMessage hay que utilizar una estructura COPYDATASTRUCT

  Public Type COPYDATASTRUCT
    dwData As Long 'De libre uso, por lo general es para indicar el tipo de inf.
    cbData As Long ' Largo de los datos, utiliza LenB
    lpData As Long 'Puntero a los datos a enviar con la función StrPtr (no esta documentada)
  End Type

Ejemplo :

    cdsDatos as COPYDATASTRUCT
    TextoAEnviar = "Mensaje de Prueba"

    cdsDatos.dwData = "1"
    cdsDatos.cbData = LenB(TextoAEnviar)
    cdsDatos.lpData = StrPtr(TextoAEnviar)

  Para enviar la inf. es : SendMessage Ventana, WM_COPYDATA, 0, cdsDatos

  Para recibir el mensaje hay subclasificar la ventana de la aplicación que debe quedar esperando, esto se tiene que hacer para poder atrapar los mensajes que le puedan llegar, se hace de la siguiente forma :
 (subclasificar una ventana significa poder interceptar los mensajes que le llegan)

  AntProc = SetWindowLong(form1.hwnd, GWL_WNDPROC, AddressOf WindowProc)

  Devuelve un puntero al manejador de mensajes original y se reemplaza por la función WindowProc

  WindowProc es la rutina que va ha recibir los mensajes :

  Public Function WindowProc(ByVal hWnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, ByVal lParam As Long) As Long

    'Utilizar el manejador original de mensajes, el que se respaldo.
    WindowProc = CallWindowProc(AntProc, hWnd, wMsg, wParam, lParam)
    'Si es el mensaje de envío de datos lo procesamos
    If wMsg = WM_COPYDATA Then
       Dim cdsDatos As COPYDATASTRUCT
       CopyMem cdsDatos, ByVal lParam, LenB(cdsDatos) ' Se copia la estructura
       Dim Dato As String
       Dato = Space$(cdsDatos.cbData / LenB("A"))
       CopyMem ByVal StrPtr(Dato), ByVal cdsDatos.lpData, ByVal cdsDatos.cbData
       ' Se copia el mensaje
       Msgbox Dato
    End If
  End Function

 Public Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

    Un comentario sobre el ejemplo de los mensajes :

    La aplicación esta diseñada para funcionar con ejecutables, si desean probarla desde el IDE de V.B. se debe corregir en el main el nombre de la clase que debe buscar, ya que esta cambia si esta compilada o en el ambiente, por lo que debe quedar :

    hWnd_Destino = FindWindow("ThunderForm", Caption)

El nombre de la clase de una aplicación V.B. que esta compilada es : "ThunderRT5Form".

Ahora, si se quiere utilizar con otra aplicación de otro lenguaje se debe averiguar el nombre de la clase, esto último no se como se puede hacer..


Mauricio.

Download demomensajes.zip  

Mensaje enviado por "Raul Diaz Solis (Peky)" <vb-esp@csplusware.com>

Me permito responder con un attach ya que sólo es de 8 kb.

En el archivo adjunto está el código fuente y un ejecutable que hice para poder enviar mensajes entre aplicaciones.

Para hacerlo tomé como base algún lugar del MSDN que no recuerdo pero que trata justamente sobre el tema.


El programa expone 2 clases: Una se llama amCliente y la otra amServidor. Las clases son prácticamente iguales. La única diferencia es en el sentido en que se envían los mensajes.

Como se usa:

*En un formulario del programa CLIENTE se declara:

private withevents Cli as ApplMsg.amCliente

en el Form_Load se instancia la variable
set Cli = New ApplMsg.amCliente

y se esperan los mensaje (strings) en el evento Cli_MensajeRecibido(msg as string)

* En un formulario del programa SERVIDOR se declara:

private withevents SVR as ApplMsg.amServidor

en el Form_Load se instancia la variable
set Svr = New ApplMsg.amServidor

y se esperan los mensaje (strings) en el evento Svr_MensajeRecibido(msg as string)

La forma de enviar un mensaje del cliente al servidor es Cli.EnviarMensaje "Texto del Mensaje"

La forma de enviar un mensaje del servidor al cliente es Svr.EnviarMensaje "Texto del Mensaje"


Los mensajes enviados desde un cliente serán "escuchados" desde todas las instancias de amServidor y los mensajes enviados desde un servidor serán "escuchados" por todas las instancias de amCliente

El código es muy breve así que no duden en mirar cómo funciona. Avisen si necesitan alguna explicación.

Perdón. por escribir apurado me olvidé de indicarles que deben referenciar al ejecutable para disponer de las clases. El ejecutable es un activex exe.


Peky
----------------------------------------------------------------------------
-----------------------
C&S PlusWare - Santa Fe 3468 - (4000) S. M. de Tucumán - Argentina
Tel: (+54)-381-4237279 - Tel/Fax: (+54)-381-4322233
e-mail: <peky@csplusware.com>
Home page: http://www.csplusware.com

Download applmsg.zip  



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com