Ver Mensaje Individual
  #1  
Antiguo 22-05-2006
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Reputación: 0
Aldo Va por buen camino
SendMessage y dos instancias de una aplicación

Hola a Todos:

Estoy trabajando con Delphi5 y tengo una aplicación que permite la ejecución de solo una instancia a la vez. Esto está logrado creando Mutex y cuando se ejecuta la segunda instancia de la aplicación, se envía un mensaje a la primera instancia para que ésta se venga al primer plano y la segunda instancia deja de ejecutarse.

Hasta aquí todo bien, el problema que tengo ahora es que quiero mandar otro mensaje a la primera instancia de la aplicación antes de hacer todo lo explicado en el párrafo anterior y lo hago, pero la primera instancia no me responde, por lo visto no recibe el mensaje.

Os pongo la parte del código fuento que previene que se ejecute más de una instancia de la aplicación a la vez:
Código Delphi [-]
 {Attempt to create a named mutex}
     CreateMutex( nil, False,  PChar( 'Main' ) );

     {if it failed then there is another instance}
     if GetLastError = ERROR_ALREADY_EXISTS then
        begin
           EnviarMensaje;

           {Send all windows our custom message - only our other}
           {instance will recognise it, and restore itself}
           SendMessage( HWND_BROADCAST, RegisterWindowMessage( 'Main' ), 0, 0 );

           {Lets quit}
           Halt(0);
        end;

El problema viene en el Procedimiento EnviarMensaje;
Código Delphi [-]
     procedure EnviarMensaje;
     var
        nHwnd     : HWND;
        Estructura: TGdbMantEstruc;
        nModo     : TModoEjecucion;
        nResult   : Integer;
     begin
        nHwnd := FindWindow( PChar( 'TMain' ), CAPT_VENTANA_PPAL_GDBMANT );
        if nHwnd <> 0 then
           begin
              ClearGdbMantEstruc( Estructura ); // Inicializar la Estructura 
              try
                 // Según los parámetros de la línea de comandos del llamado a la 
                 // aplicación, devuelve un tipo que dice que debe hacerse
                 nModo := DetectarModoEjecucion();  

                 case nModo of
                    // LLenar la parte de la estructura con la información
                    // necesaria para que se ejecute la aplicación al recibir el 
                    // mensaje desde la otra instancia
                    tEjecutarAhora : 
                       if ParamCount = 2 then 
                          Estructura.szDescTareaOld := ParamStr( 2 );  
                 end;
                  
                 // Envío de un mensaje a la otra instancia de la misma aplicación 
                 // con el mensaje que se calcula automáticamente como 
                 // WM_USER + 1000 + nModo, pasando en wParam un puntero a 
                 // la estructura con toda la información necesaria según sea el 
                 // caso de nModo
                 nResult := SendMessage( nHwnd, 
                                         ModoEjecucionToCodigoMessage( nModo ), 
                                         longint( @Estructura ), 
                                         0 );
              finally
                 // Liberar la memoria que ya no se usa de la estructura 
                 ClearGdbMantEstruc( Estructura, True );
              end;
           end;
     end;

Por ultimo en el procedimiento DefaultHandler del formulario principal de la aplicación se pone lo siguiente para tratar el mensaje que se supone que debe llegar a ella, pero que no está llegando.

Código Delphi [-]
procedure TMain.DefaultHandler(var Message);
begin
  inherited DefaultHandler(Message);

  if TMessage( Message ).Msg = fUserMessage then
     begin
        ReplyMessage( 0 );
        CargarFicheroLog;
     end
  else if TMessage( Message ).Msg >= WM_USER + 1000 then
     begin
        case TMessage( Message ).Msg of
           WM_USER + 1000 + 0  : { tNormal };
           WM_USER + 1000 + 1  : { tTaskBar };
           WM_USER + 1000 + 2  : { tInstalar };
           WM_USER + 1000 + 3  : { tDesinstalar };
           WM_USER + 1000 + 4  : { tCrearAccion };
           WM_USER + 1000 + 5  : { tCrearProgramacion };
           WM_USER + 1000 + 6  : { tEditarAccion };
           WM_USER + 1000 + 7  : { tEditarProgramacion };
           WM_USER + 1000 + 8  : { tEliminarTarea };
           WM_USER + 1000 + 9  : { tEliminarAccion };
           WM_USER + 1000 + 10 : { tEliminarProgramacion };
           WM_USER + 1000 + 11 : { tDetenerServicio };
           WM_USER + 1000 + 12 : { tIniciarServicio };
           WM_USER + 1000 + 13 : { tRefrescar };
           WM_USER + 1000 + 14 : { tEjecutarAhora }
              EjecutarTarea( PGdbMantEstruc( TMessage( Message ).WParam )^.szDescTareaOld );
        end;
     end;
end;

No sé si lo que quiero hacer es factible o no y si es afirmativo, entonces ¿ En que me puedo estar equivocando ?.

Les agradezco el tiempo prestado y sus posibles respuestas de antemano
Responder Con Cita