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)
-   -   Compartir Variable entre dos aplicaciones (https://www.clubdelphi.com/foros/showthread.php?t=48898)

gluglu 07-10-2007 15:45:44

Compartir Variable entre dos aplicaciones
 
Hola de nuevo !

Al margen de este hilo me gustaría pedir vuestro consejo acerca de la mejor y más eficiente manera de hacer lo siguiente :

Tengo una aplicación corriendo en 'BackGround' que analiza una tabla de datos (Horarios / llamadas de despertador en mi aplicación de hotel). Esta aplicación se encuentra visible o no (segun los datos correspondientes) con un TrayIcon.

Por otro lado tengo una aplicación principal (de gestión hotelera) que cuando se carga solicita el código de usuario.

En la aplicación de llamadas de despertador se debe confirmar si el cliente ha contestado a la llamada, si no ha contestado, o si comunica. Para ello grabo registros en otra tabla que (... y aquí está la clave del asunto) necesitan además un campo de identificador de usuario.

La aplicación de despertador se activará automáticamente cuando existen llamadas de despertador a realizar. Pero puede en ese momento estar o no activo el programa principal de hotel. Por lo tanto puede haber un usuario identificado o no.

Lo que quiero es poder saber en el programa de llamadas de despertador si el programa principal está activo y existe un usuario identificado. Si es así, quiero obtener el código de dicho usuario y si no hay ninguno, entonces tendría que pedir el código de usuario en el programa de llamadas de despertador.

Había pensado varias opciones. La mejor de todas el utilizar CreateFileMapping para compartir la variable de usuario definida en el programa principal de hotel. Con ello cada vez que se activara el programa de llamadas de depsertador y se realizara una operación de confirmación se buscaría si existe la zona de memoria compartida y de ahí leería la variable de código de usuario.

Otra opción que había pensado es utilizar WM_COPYDATA. Me encuentro algunos problemas. WM_COPYDATA tendría que ser 'activado' por el programa principal para enviar el código de usuario a la aplicación de despertador. Pero podría o no estar activa dicha aplicación de despertador.

Por el contrario, si no estuviera activa, y la aplicación de despertador de ejecutara después de haberse ejecutado la aplicación principal de hotel, no sabría como averiguar el código de usuario previamente introducido en el programa principal.

Había pensado incluso utilizar el Registro de Windows, pero si cualquier aplicación (por ejemplo la principal de hotel) se cae, la anotación en el registro quedaría y no sería coherente con saber que realmente hay un usuario activo y con el programa principal de hotel abierto.

Por tanto, después de todo este rollo de explicación, solicito de vuestros consejos y ayudas para solventar este problema.

Un saludo !! :rolleyes:

seoane 07-10-2007 16:32:52

Si he entendido bien tu explicación, en un momento determinado la aplicación despertador necesita saber que usuario, si hay alguno, esta autentificado en la aplicación principal. No se de que tipo es el "identificador de usuario" pero si es de tipo integer se me ocurre una solución bastante sencilla.

La función SendMessage, como cualquier función, devuelve un valor. Este valor es de tipo integer, así que si el identificador del usuario es de tipo integer solo tendríamos que enviar como resultado del mensaje el valor del identificador.

Algo así (en la aplicación principal):
Código Delphi [-]
const
  WM_GETUSERID = WM_USER + 101;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure GetUserId(var Msg: TMessage); message WM_GETUSERID;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetUserId(var Msg: TMessage);
begin
  // UserId es el identificador del usuario
  Msg.Result:= UserId; 
end;

Y en el despertador:
Código Delphi [-]
  // Handle es el manejador de la ventana principal
  UserID:= SendMessage(Handle,WM_GETUSERID,0,0);

gluglu 07-10-2007 23:41:10

Domingo !! Gracias !!

No era consciente de que un mensaje devolvía un valor. En efectivo el número de usuario es un integer. Lo he implementado ya y funciona perfectamente. ;)

De nuevo, mil gracias ! :)


La franja horaria es GMT +2. Ahora son las 05:04:15.

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