Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-05-2006
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 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
 



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
Evitar Instancias Multiples De Mi Aplicacion edgusano .NET 8 28-04-2005 19:21:02
Instancias de SQLServer HombreSigma MS SQL Server 3 25-04-2005 23:11:43
Multiples instancias Phacko Varios 1 07-09-2004 15:40:25
instancias abiertas muli Firebird e Interbase 0 07-07-2004 19:48:23
instancias botones67 Varios 1 22-08-2003 19:06:11


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


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