Cómo evitar dos ejecuciones simultáneas de una aplicación

5404 vistas

Existen varias formas de evitar más de una ejecución simultánea de una aplicación. No obstante, sin duda la más elegante es el uso de Mutex.
Los Mutex son variables globales que generan un mensaje de error cuando se intenta instanciar una vez ya creado. Por lo tanto, Para impedir el segundo lanzamiento de la misma aplicación sólo es necesario de chequear si se produce un error en la creación del Mutex para nuestra aplicación. Esto lo realizaremos desde el código fuente del proyecto (menú View|Project Source).

El código fuente de un proyecto nuevo es algo parecido a esto:



delphi
  1. program Project1;
  2.  
  3. uses
  4.   Forms,
  5.   Unit1 in 'Unit1.pas' {Form1};
  6.  
  7. {$R *.RES}
  8.  
  9. begin
  10.   Application.Initialize;
  11.   Application.CreateForm(TForm1, Form1);
  12.   Application.Run;
  13. end.



Todas las funciones relativas a los Mutex se encuentran en la unidad Windows, por lo que será necesario su inclusión en la cláusula uses.
Para estar totlamente seguros de que ningún otro error vendrá a perturbar el lanzamiento de nuestro programa, es preferible borrar cualquier resto de errores en el sistema usando para ello el comando SetLastError(NO_ERROR).
Ahora será el momento de crear el Mutex mediante la función CreateMutex(lpMutexAttributes: PSecurityAttributes, bInitialOwner: LongBool, lpName: PChar): Cardinal donde los parámetros corresponden respectivamente a los atributos de seguridad del Mutex, al hilo propietario y al nombre del Mutex. Si el Mutex existe se lanzará el error ERROR_ALREADY_EXISTS. Testeando el último error del sistema sabremos si lanzar o no nuestra aplicación.

Visto esto, el código de nuestro proyecto base quedará de la siguiente manera:



delphi
  1. program Project1;
  2.  
  3. uses
  4.   Windows, Forms,
  5.   Unit1 in 'Unit1.pas' {Form1};
  6.  
  7. {$R *.RES}
  8.  
  9. begin
  10.   SetLastError(NO_ERROR);
  11.   CreateMutex (nil, False, 'Nombre de la aplicación');
  12.   if GetLastError = ERROR_ALREADY_EXISTS then
  13.     Exit;
  14.   Application.Initialize;
  15.   Application.CreateForm(TForm1, Form1);
  16.   Application.Run;
  17. end.



Para más información de CreateMutex: MSDN - CreateMutex