| Contacto | Chat | Foro |__
  
 
Principal Hoja de Vida Universidad Artículos Programas Descargas
 

Cómo prevenir la ejecución de múltiples instancias de un programa


PROG0009 - BCB++
En este ejemplo se muestra, cómo escribir un programa en C++ Builder que evite que puedan ser ejecutadas varias instancias (simultáneamente) de si mismo. La técnica es muy sencilla, y consiste en agregar unas cuantas líneas al módulo principal del programa. En este módulo es posible identificar la función WinMain, que va a ser la primera en ejecutarse cuando el programa sea iniciado. En este módulo, deben agregarse las instrucciones que se destacan en rojo.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   HANDLE hMutex;
   const char sMutexName[]= "SingleInstanceTestApplication";

   try
   {
     
// Verificar si existe una instancia de hMutex
      hMutex= OpenMutex(MUTEX_ALL_ACCESS,false,sMutexName);

      if (hMutex==NULL)
         // Si no existe, significa que esta es la única
         // instancia del programa. Crear una instancia
         hMutex= CreateMutex(NULL,true,sMutexName);
      else
      {
         // En caso contrario, abortar la ejecución del programa
         ShowMessage("Application Already Running");
         return 0;
      }


      Application->Initialize();
      Application->CreateForm(__classid(TForm1), &Form1);
      Application->Run();
   }

   catch (Exception &exception)
   {
      Application->ShowException(&exception);
   }
   catch (...)
   {
      try
      {
         throw Exception("");
      }
      catch (Exception &exception)
      {
         Application->ShowException(&exception);
      }
   }

   // Al terminar el programa, liberar la instancia
   ReleaseMutex(hMutex);
   return 0;
}


Teoría de operación


Cuando el programa inicia, lo primero que hace es intentar acceder a una variable (mutex) llamada en este caso SingleInstanceTestApplication, utilizando la función API OpenMutex. Esta función devuelve un apuntador; si la variable no existe, el valor devuelto es NULL. devuelto es NULL.

Si el programa no consigue abrir la variable, significa que esta es la única instancia en ejecución. Si es así, la crea de inmediato. Si por el contrario la variable ya existe, la ejecución del programa es finalizada.

Aunque el proyecto está escrito para C++ Builder 6.0, la técnica funciona con cualquiera de las versiones de este compilador, ya que está basado en el uso de una función del API de Windows.

Advertencia
Aunque no he escatimado esfuerzos en cuanto a proveer aplicaciones e información confiable y veraz, sin embargo no puedo garantizar que esté totalmente libre de errores; por esa razón, no asumo responsabilidad alguna por las consecuencias que se deriven de su empleo.




7-Zip

Descarga Adobre Reader

Descargar programa
  Copyright 2005 | Ramón Medina | Todos los derechos reservados | Última Actualización: Agosto del 2008 | webmaster@ramonmedina.name