Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-01-2009
Avatar de The_Duke
The_Duke The_Duke is offline
Miembro
 
Registrado: abr 2006
Ubicación: Republica Dominicana
Posts: 48
Poder: 0
The_Duke Va por buen camino
Question como cerrar la instancia anterior

Saludo, estoy haciendo un visor de imágenes, y e asociado los tipos de archivo para que abran con la aplicación y quiero que si ya hay una instancia de mi aplicación presente y se abra otra imagen desde una carpeta la instancia anterior se cierre y quede solo a nueva instancia. E probado este código que encontré en el foro, pero sierra todos los procesos con el mismo nombre y trate de modificarlo pero no lo conseguí. Si conocen alguna mejor forma o pueden modificar este se lo agradecería.

Código Delphi [-]

procedure MatarProceso(FileName:String);
   var
       ContinueLoop:BOOL;
       FSnapshotHandle:THandle;
       FProcessEntry32:TProcessEntry32;
   const
       PROCESS_TERMINATE=$0001;
   begin
       FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
       FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
       ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
       while integer(ContinueLoop)<>0 do
       begin
           if FProcessEntry32.szExeFile=FileName then
             TerminateProcess( OpenProcess(PROCESS_TERMINATE,BOOL(0),
                               FProcessEntry32.th32ProcessID),0);
             ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
       end;
       CloseHandle(FSnapshotHandle);
   end;
Responder Con Cita
  #2  
Antiguo 21-01-2009
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Echa un vistazo a este estupendo documento.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 21-01-2009
Avatar de The_Duke
The_Duke The_Duke is offline
Miembro
 
Registrado: abr 2006
Ubicación: Republica Dominicana
Posts: 48
Poder: 0
The_Duke Va por buen camino
Gracias por la ayuda Dec, e modificado el codigo para lo que necesito.
y aqui lo dejo para os que os puedan necesitar, y si hacen alguna mejora, ya que encuentro que es ago ento no mucho pero se nota.

Código Delphi [-]
unit UIApp;

interface

implementation

uses
  Windows, SysUtils, Forms, Dialogs, Messages, Unit1;

const
  { Cadenas para registrar el mutex y el mensaje }
  sMutex   = '10D73234-C9F7-4C2D-BC7E-39B5820AF456';
  sActivar = '3F154732-CCDE-4BC7-9439-AFCD3BCFA84D';

var
  mActivar    : Cardinal; { Mensaje para activar la instancia anterior }
  Mutex       : Cardinal; { Mutex                                      }
  PrevWndProc : TFarProc; { Procedimiento de ventana original          }


function AppWndProc(Handle: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
var
  FgThreadId  : DWORD; { Hilo de la app. que tenga el foco }
  AppThreadId : DWORD; { Hilo de nuestra aplicación        }

begin

  if Msg = mActivar then
  begin

    Form1.close;

  end
  else
    { Dejar que el procedimiento original se encargue de los otros mensajes }
    Result := CallWindowProc(PrevWndProc, Handle, Msg, wParam, lParam);


end;

procedure Activar;
begin
  { Mandamos el mensaje a todas las ventanas }

   SendMessage(HWND_BROADCAST, mActivar, 0, 0);
  end;

procedure Registrar;
begin
  mActivar := RegisterWindowMessage(sActivar);
  Mutex    := CreateMutex(nil, true, sMutex);

  { Si ya existe el mutex lanzamos una excepción silenciosa }
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
        Activar;
        PrevWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
  SetWindowLong(Application.Handle, GWL_WNDPROC, LongWord(@AppWndProc));
  end
  else
  begin
    { Sustituimos el procedimiento de ventana }
    PrevWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongWord(@AppWndProc));
  end;
end;

initialization
  try
    Registrar;
  except
    Halt;
  end;

finalization
  if Mutex <> 0 then ReleaseMutex(Mutex);
end.

Última edición por The_Duke fecha: 22-01-2009 a las 00:23:28.
Responder Con Cita
Respuesta



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
Como obtener el registro anterior al ultimo MRang14 SQL 11 07-05-2008 23:48:33
instancia de sql 2000 richy08 MySQL 4 17-12-2007 23:04:46
Saltar al control anterior, shift+tab. ¿COMO? seldonito Varios 3 09-02-2006 01:54:46
Cómo detectar una instancia de una aplicación Ana Tudela API de Windows 1 30-06-2005 12:20:13
Como puedo saber si un una variable instancia se le a realiso un create orfeo OOP 1 05-05-2003 08:42:38


La franja horaria es GMT +2. Ahora son las 08:06:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi