Amigo
GluGlu, finalmente has encontrado alguna solución a esto?... Estoy por pasar por este mismo inconveniente.
Tengo una aplicación
"MyApp.exe" donde cada usuario levanta una instancia de ella, con conexiones de Escritorio Remoto. Incluso, en la sesion del Administrador en el propio servidor (WinServer2008) ciertas veces existe tambien otra instancia en ejecución de dicho programa.
Además de esto, un segundo ejecutable
"Monitor.exe", está siempre en funcionamiento en la sesion del Administrador y realiza un proceso donde las distintas etapas del mismo deben ser notificadas a la/las instancias del programa "MyApp.exe"
Actualmente lo tenía resuelto mediante el uso de
Messages de Windows, esto es:
Desde el programa
"Monitor.exe" cada vez que se necesita notificar algo, se invoca la función
SendAppMessage() que hace esto:
Código Delphi
[-]type
TMonitor1: class(TForm)
...
private
function SendAppMessage(mensaje:string):Boolean;
...
end;
function TMonitor.SendAppMessage(mensaje:string):Boolean;
var
CopyDataStruct : TCopyDataStruct;
hReceptor: THandle;
Respuesta: integer;
begin
Result:= False;
CopyDataStruct.dwData := 0; CopyDataStruct.cbData := Length( mensaje )+1;
CopyDataStruct.lpData := PChar( mensaje );
hReceptor := FindWindow( PChar('CORE') , nil );
if hReceptor = 0 then
begin
Exit;
end;
Respuesta := SendMessage( hReceptor, WM_COPYDATA, Integer( Handle ),
Integer( @CopyDataStruct ) ) ;
Result := (Respuesta = 1);
end;
if (sTime='18:00') then SendAppMessage('Happy Hour... vamos por una cerveza fría !');
Por otro lado, el programa
"MyApp.exe", siempre está "a la escucha" de esos mensajes mediante un evento que se dispara de forma automática cuando aparece un mensaje invocando al proceso
RecibirAppAmessage() que es este:
Código Delphi
[-]type
TForm1: class(TForm)
...
procedure RecibirAppMessage( var Msg: TWMCopyData ); message WM_COPYDATA;
...
end;
procedure TForm1.RecibirAppMessage( var Msg: TWMCopyData );
var
s1:string;
begin
s1:= PChar( Msg.CopyDataStruct.lpData );
if bShowMessage
then ShowMessage( s1 )
else StatusBar1.Panels[3].Text := s1;
Msg.Result := 1; end;
Lo malo de esto es que, una vez que
"MyApp.exe" "publica" el mensaje, lo toma la primera sesion abierta de
"MyApp.exe" que logra mostrar el mensaje en su pantalla, pero el resto de las instancias no reciben nada. O sea, lo consume la primera instancia abierta y "se borra" para el resto.
Debido a esto, estaba pensando en realizar mensajes UDP, pero me encuentro con el problema planteado aqui de las instancias de Escritorio Remoto y el problema de la apertura del PORT.
Como has resuelto esto?