Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Comunicación entre aplicaciones (https://www.clubdelphi.com/foros/showthread.php?t=88458)

ElDuc 09-06-2015 08:19:20

Comunicación entre aplicaciones
 
Buenos días/noches mundo,

Tengo un problema desde tiempos inmemoriales que no soy capaz de solventar, evidentemente por mi inutilidad.

Lo he buscado en el foro innumerables veces y no encuentro nada, evidentemente por mi inutilidad. ( de paso si alguien me puede explicar como funciona el buscador se lo agradeceré, esta misma solicitud la hice hace un par de año y no tuve ninguna respuesta.

Vamos al ajo!

Necesito comunicar varias aplicaciones entre ellas y hasta el momento lo he probado con:
1 - Mensajes windows: Desconozco a priori el nombre de las ventanas ( o al menos de todas) y no soy capaz de conseguirlo
2 - Variables de sistema (las que se guardan en zonas de memoria compartida. No soy capaz.
3 - Servicios Windos, no soy capaz de poner dentro del servicio una función/procedimiento que pueda llamar desde cualquier programa.

Tal como decía al principio, es posible que este tema ya se aya tratado, si alguien me indica donde puedo mirar, estaré agradecido.

De todas formas, me gustaría que también me indicarais cual es la mejor forma de hacerlo desde un punto de vista técnico (Eficiencia, rapidez, menos recursos, etc) para poder centrarnos en un sistema de comunicación entre aplicaciones, ya digo que no dispongo del nombre de todas las ventanas que utilizarán el servicio/sistema porque algunas se crean en tiempo de ejecución y no puedo saber el nombre y caption que se les asignará.

Si alguien me pudiera ayudar me sacaría de un atasco de semana. :mad:

Muchas gracias a todos. ^\||/

TheReeler 09-06-2015 08:28:38

Uf, yo lo hice hace un montón de años y no tengo el código, pero me suena mucho que fue por la primera opción, usando NET SEND. Ahí no necesitas saber el nombre de la ventana, puedes enviar un mensaje a todo un dominio.

duilioisola 09-06-2015 09:41:39

Para buscar lo mejor es ir a San Goolge y utilizar la parte "site: clubdelphi.com"

Por ejemplo puedes buscar:
Cita:

comunicacion entre aplicaciones site: clubdelphi.com

duilioisola 09-06-2015 10:05:46

He visto esto en la web de Tory: http://www.swissdelphicenter.ch/torr...ode.php?id=418

Código Delphi [-]
{
You can perform communication between your application using Windows messages
exchange mechanism. We can use HWND_BROADCAST value for first parameter for
SendMessage function for suppressing finding of forms' in other applications HANDLE.
For using HWND_BROADCAST we should register our messages in Windows.
In example below we will inform about our form's top position)

Das Beispiel zeigt, wie zwischen zwei Applikationen eine Meldung (Message)
verschickt werden kann. Die Meldung mit wird mit SendMessage verschickt.
Der erst Parameter ist HWND_BROADCAST, beim zweite ist unsere Message.
Das untenstehende Beispiel informiert z.B über die Top-Position unserer Form}


// 1. Define type of your message structure, it could be something like this:
// 1. Definiere eine eigene Message Struktur:


type
  TWMMYMessage = record
    Msg: Cardinal;   // ( first is the message ID )
    Handle: HWND;    // ( this is the wParam, Handle of sender)
    Info: Longint;   // ( this is lParam, pointer to our data)
    Result: Longint;
  end;

  // 2. Override your form's DefaultHandler method and add
  //    method for handling your message, like this
  // 2. Die DefaultHandler Methode zu überschreiben

  TForm1 = class(TForm)
    ...public
    { Public declarations }
    ...procedure DefaultHandler(var Message); override;
    procedure WMMYMessage(var Msg: TWMMYMessage);
    ...end;


  // 3. Declare message variable:
  // 3. Die Message-Variablen deklarieren:

var
  WM_OURMESSAGE: DWORD;

  // 4. Insert realisation of DefaultHandler and our message handler methods:
  // 4. DefaultHandler Implementation:

procedure TForm1.DefaultHandler(var Message);
var
  ee: TWMMYMessage;
begin
  with TMessage(Message) do
  begin
    if (Msg = WM_OURMESSAGE) then 
    begin
      ee.Msg    := Msg;
      ee.Handle := wParam;
      ee.Info   := lParam;
      // Checking if this message is not from us
      if ee.Handle <> Handle then
        WMMYMessage(ee);
    end
    else
      inherited DefaultHandler(Message);
  end;
end;

procedure TForm1.WMMYMessage(var Msg: TWMMYMessage);
begin
  label1.Caption := Format('Our another form handle :%d', [Msg.Handle]);
  Label2.Caption := Format('Our another form top :%d', [Msg.Info]);
end;

// 5. Add registration of your message that you could
//    handle the HWND_BROADCAST messages:
// 5. Die Message registrieren.

initialization
  WM_OURMESSAGE := RegisterWindowMessage('Our broadcast message');

  // 6. Add the message sending somewhere:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Handle, Top);
end;

    // 7. Compile and run two copies of your application and test it functionality.
    // 7. Complilieren und zwei Kopien der Applikationen ausführen.

AgustinOrtu 09-06-2015 20:01:42

Con respecto a como usar el buscador:
Busquedas avanzadas

Con respecto al problema no explicas exactamente lo que necesitas, pero pareciera que la biblioteca liberada por el maestro Al Gonzalez Objetos superglobales pueda servirte

O si estas usando las ultimas versiones de Delphi, a partir de XE6 podes usar App Tethering lo cual es mucho mas amigable

PD: Por cierto, ahora que lo veo, en la parte de abajo de esta pagina, en "Temas similares" puede haber mas alternativas :)

ElDuc 12-06-2015 17:08:01

Las dos últimas propuestas son muy interesantes, cuando tenga un segundo las compruebo.

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 16:16:03.

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