Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pasar mensajes con punteros a otra aplicación

Por lo que se, para que TApplication reciba un mensaje de usuario hay que definir el evento Application->OnMessage = AppMessage; y escribir AppMensage:
Código:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  // Asignación del procesador de mensajes para la aplicación y sus ventanas
  Application->OnMessage  = AppMessage;
}
.
.
.
.
//---------------------------------------------------------------------------
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
   // USERM_SETPARAM Mensaje de Usuario pasar parámetros
   if (Msg.message == USERM_SETPARAM){
     CmdLine = (char*)Msg.wParam;
     Handled = true;
   }
}
Para que esta forma de enviar mensajes funcione, deben enviarse con la funcion PostMessage. No admite SendMessage del API de Windows, según la propia ayuda de Builder y mi propia experiencia.

El problema está que la ayuda de Builder advierte que no se pasen punteros pues se perderán antes de recibir el mensaje.

He comprobado que si ese mensaje con punteros se envía desde la propia aplicación, el puntero no se pierde. Sin embargo, si es otra la aplicación que lo envía, se recibe el puntero, pero su contenido es NULL.

Se me ocurre sobrecargar la funcion TApplication:WndProc(Messages::TMessage &Message), pero me parece engorroso.

¿Alguien tiene una idea de un método más simple?

Saludos
Responder Con Cita
  #2  
Antiguo 14-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
¿son ambas aplicaciones hechas en builder?

Si es así, revisa la idea de Al de los objetos SuperGlobales

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 14-02-2008
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
El problema lo estas enfocando de una manera incorrecta, cada aplicacion tienen un espacio de direcciones distinto, y no se ven unas a otras, aunque pases el puntero de una aplicacion a otra (total solo es un numero una direccion de memoria) no podras hacer nada con eso para acceder a los datos de la otra aplicacion ya que te saldra un "access violation".

Tendras que usar ficheros mapeados en memoria o crear memoria compartida, para que las dos aplicaciones puedan acceder a la misma zona de memoria.


Ssludos
Responder Con Cita
  #4  
Antiguo 14-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
jachquate, si, ambas aplicaciones están escritas en Builder.
Mick, No estoy muy seguro de que no pueda pasar punteros por los espacios de memoria diferentes. No obtengo errores "access violation", simplemente el valor se borra, como advierte la ayuda "Si se usa PostMessage".

Por otro lado el propio Windows tiene mensajes para pasar texto WM_GETTEXT y WM_SETTEXT. Y con esto yo si paso texto con las API.
Yo pretendo un mensaje de usuario para poder interceptarlo inequívocamente y de alguina manera emular lo que el propio windows hace...

Me miraré lo de los objetos superglobales....

Gracias
Responder Con Cita
  #5  
Antiguo 14-02-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si se pudieran compartir punteros a través de simples mensajes me pregunto para que creo microsoft el mensaje WM_COPYDATA.

En realidad es como te dice Mick, no se pueden compartir punteros entre aplicaciones. Sin embargo con ciertos mensajes puede dar esa impresión, pero es internamente windows el que se encarga de "copiar" los datos de un proceso a otro.

En resumen, yo utilizaría WM_COPYDATA que por algo lo creo microsoft
Responder Con Cita
  #6  
Antiguo 14-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Muchas gracias [seoane]. Voy a seguir tu consejo.

EDITO:
Parece ser que sólo se puede usar con SendMessage y no con PostMessage.
Para sobrecargar la recepción de un mensaje a una aplicación en Builder, e imagino que también en delphi, solo se puede usar PostMessage. Esto obliga a utilizar otro método de sobrecarga, quizas reescribir (como ya apunté al principio) TApplication:WndProc(Messages::TMessage &Message) o en su caso usar una clase derivada de TApplication.

Se me antoja que debería ser mas sencillo.

Última edición por escafandra fecha: 14-02-2008 a las 21:59:47. Razón: Añado comentario
Responder Con Cita
  #7  
Antiguo 15-02-2008
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Una pregunta, ¿por qué no utilizar la comunicación por red, a través del loop-back (localhost ó 127.0.0.1)? Es el método que se suele utilizar en los sistemas POSIX (UNIX, Linux, Solaris, MacOS, ...), incluso para comunicar el programa con el gestor de ventanas, y en mi opinión es bastante mejor, más lento pero mucho más flexible y menos propenso a las corrupciones de memoria.

En fin, una simple opinión.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
pasar un puntero a una funcion baby Varios 2 21-05-2007 13:10:22
Se Pueden Pasar Form/units de una aplicacion a otra? Alexis De la Cr Varios 8 06-07-2006 19:05:42
Pasar texto de una aplicacion delphi a otra OmarPerez API de Windows 4 13-07-2005 20:56:19
Recibir parametros de otra aplicacion en Delphi Coco_jac Varios 1 30-05-2005 17:43:17
pasar parametros ms-dos desde mi aplicacion ixMike API de Windows 5 13-02-2005 15:56:38


La franja horaria es GMT +2. Ahora son las 12:29:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi