Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar una instancia de un programa solo una vez (https://www.clubdelphi.com/foros/showthread.php?t=88806)

noobdelphi5 04-08-2015 02:11:17

Ejecutar una instancia de un programa solo una vez
 
:) Buen día,

Uso delphi 7, lo que quiero hacer es que al ejecutar el archivo .exe solo se pueda abrir la primera vez, al volver abrirlo no lo haga si ya esta abierto. ¿Alguien tiene la solución?

Saludos!!

AgustinOrtu 04-08-2015 02:30:41

Hay dos soluciones a tu problema en la sección de trucos del foro, una de roman y otra de Nelson

Neftali [Germán.Estévez] 04-08-2015 10:50:52

Aquí tienes el link de la unit de Román, de la que se ha hablado muchas veces en los foros.

nlsgarcia 04-08-2015 15:58:37

noobdelphi5,

Cita:

Empezado por noobdelphi5
...Ejecutar una instancia de un programa solo una vez...

:rolleyes:

Revisa esta información:
Espero sea útil :)

Nelson.

ecfisa 04-08-2015 16:24:35

Hola noobdelphi5.

Otro enlace que te podría interesar:
Saludos :)

noobdelphi5 05-08-2015 18:20:12

Solución
 
Si ya resolví el problema, todas las respuestas me funcionaron, yo use el código de nlsgarcia, el único código que no pude correr fue el de Roman, después lo checo con mas calma, me salía:

[Fatal Error] UIApp_fmx.pas(24): File not found: 'FMX.Forms.dcu'
[Fatal Error] UIApp_fmx.pas(24): File not found: 'FMX.Platform.Win.dcu'

Codigo de eficsa

Código Delphi [-]
program Project1;

uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

  resourcestring
   SAlreadyRunning =
      'Existe otra instancia activa de esta aplicación.'#13 +
      'La presente instancia se detendrá ahora mismo.';

  function AlreadyRunning(const AIdentifier: string): Boolean;
begin
  CreateMutex(nil, False, PChar(AIdentifier));
  AlreadyRunning := GetLastError = ERROR_ALREADY_EXISTS;
end;

  begin
   if AlreadyRunning('Empresa.Aplicación.Versión') then
   begin
      MessageBox(0, PChar(SAlreadyRunning), 'Error', MB_ICONSTOP or MB_OK);
      Halt(1);
   end;
   Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;

end.


Otra forma:

Código Delphi [-]
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
  Mutex : THandle;
begin
  Mutex := CreateMutex(nil, True, 'My_Unique_Application_Mutex_Name'); 
  if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
  begin

    // code to searh for, and activate 
    // the previous (first) instance

  end
  else
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    if Mutex  0 then
      CloseHandle(Mutex); 
    end;
  end;
end.

Gracias!!

AgustinOrtu 05-08-2015 19:30:54

El que te paso Neftali es la version para FireMonkey.

Buscando por el foro no encontre un enlace valido a la pagina de roman (parece estar caida), tampoco en el FTP del club

Lo mas cercano que encontre es esto, aunque no estoy seguro de si es "la ultima version"

De todos modos en el hilo de la version para FireMonkey esta explicado que es lo que cambie para que funcione para FMX; al deshacerse de eso volveria a servir para VCL

noobdelphi5 07-08-2015 20:04:49

AgustinOrtu
 
:) Gracias ya lo probé y si funciona.


La franja horaria es GMT +2. Ahora son las 20:17:40.

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