Skip to content

Como evitar la ejecución de varias instancias de una aplicación

Una forma de evitar la ejecución de varias instancias de un ejecutable en Delphi es utilizando un mecanismo de bloqueo de archivos.

Evitar varias instancias

El proceso consiste en crear un archivo temporal en algún lugar del sistema, cuando se inicia la aplicación, y tratar de adquirir un bloqueo exclusivo sobre ese archivo. Si el bloqueo es exitoso, significa que esa es la primera instancia de la aplicación en ejecución y se permite continuar con la ejecución normal.

Si no se puede adquirir el bloqueo, significa que ya hay una instancia de la aplicación en ejecución, por lo que se puede mostrar un mensaje de error o simplemente cerrar la aplicación.

Ejemplo para vitar la ejecución de varias instancias de una aplicación

Aquí te muestro un ejemplo de cómo podrías implementar esto en Delphi:

const
  LOCK_FILE = 'C:\temp\myapp.lock';
var
  lockFile: THandle;
begin
  lockFile := CreateFile(LOCK_FILE, GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, 0);
  if lockFile = INVALID_HANDLE_VALUE then
  begin
    if GetLastError = ERROR_FILE_EXISTS then
    begin
      MessageDlg('La aplicación ya se está ejecutando.', mtError, [mbOK], 0);
      Exit;
    end
    else
      RaiseLastOSError;
  end;
  // Continuar con la ejecución normal de la aplicación
  // ...
  CloseHandle(lockFile);
end.

En este ejemplo se esta creando un archivo temporal con el nombre especificado en la constante LOCK_FILE, utilizando la función CreateFile().

Si la función devuelve un valor diferente a INVALID_HANDLE_VALUE significa que el archivo se creo correctamente y se adquirio un bloqueo exclusivo sobre él, lo que indica que es la primera instancia de la aplicación en ejecución. Si el archivo ya existe, la función devuelve INVALID_HANDLE_VALUE y se comprueba el valor de GetLastError() para determinar si se trata de un error o si ya hay una instancia de la aplicación en ejecución.

Si ya hay una instancia en ejecución se muestra un mensaje de error y la aplicación se cierra, de lo contrario se continua con la ejecución normal de la aplicación y al final de la misma se cierra el archivo temporal.

Es importante tener en cuenta que esta es solo una de las muchas formas de evitar la ejecución de varias instancias de un ejecutable en Delphi, existen otras técnicas que también pueden ser utilizadas.

Por ejemplo, se puede utilizar un mecanismo de comunicación entre procesos para enviar un mensaje a la instancia existente de la aplicación y pedirle que se active o muestre una ventana en primer plano, en lugar de simplemente cerrar la nueva instancia.

Otra técnica que se puede utilizar es la creación de un objeto de sistema global, utilizando la función CreateMutex().

Este objeto es único en todo el sistema y se puede utilizar para evitar la ejecución de varias instancias de la aplicación, de la misma manera que se utiliza el archivo temporal en el ejemplo anterior.

En cualquier caso, es importante elegir una técnica que se ajuste a las necesidades específicas de tu aplicación y que sea fácil de implementar y mantener.

Y para evitar la ejecución de varias instancias de un ejecutable en Delphi se pueden utilizar diferentes mecanismos como bloqueo de archivos, comunicación entre procesos, o la creación de un objeto de sistema global.

Otro método para evitar multiples instancias de una aplicación

Existen otros métodos para evitar la ejecución de varias instancias de un ejecutable en Delphi, algunos de ellos son:

  • Utilizar la función FindWindow() de Windows para buscar una ventana de la aplicación existente y activarla en caso de que ya esté en ejecución.
  • Utilizar un archivo de configuración o un registro para almacenar información sobre la instancia actual de la aplicación y comprobar si ya existe una instancia antes de iniciar una nueva.
  • Utilizar un servicio de red o una base de datos para comprobar si ya existe una instancia de la aplicación en ejecución.
  • Utilizar la función Windows RegisterApplicationRestart() para registrar la aplicación para un reinicio automático en caso de que se cierre inesperadamente.
  • Utilizar un semáforo para evitar la ejecución de varias instancias de un ejecutable, este mecanismo es similar al de la creación de un objeto de sistema global.

Al igual que en el caso anterior, es importante elegir una técnica que se ajuste a las necesidades específicas de tu aplicación y que sea fácil de implementar y mantener.