Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Controlar la ejecución de un proceso (https://www.clubdelphi.com/foros/showthread.php?t=73276)

satelier.martin 12-04-2011 17:42:20

Controlar la ejecución de un proceso
 
Hola a todos, les cuento que luego de encontrar la forma de embeber un .exe en mi aplicación mas surgieron otras dudas como:

Como hago para controlar que la aplicación que estoy ejecutando se ejecute solo una vez, leí varias formas dentro del foro las cuales obtenían los procesos del sistema para ver si se estaban ejecutando pero pode default el .exe que ejecuto desde mi aplicación esconde el proceso por lo cual no lo ve.

Por lo cual fui por el lado de ejecutar el .exe y esperar a que termine el proceso del .exe que lance así puedo verificar si mi proceso esta levantado y no ejecutar de nuevo.

Pero me di cuenta que si voy al administrador de procesos de windows y termino mi proceso el .exe que ejecute sigue ejecutandose.

Por lo cual tengo dos proguntas como hago para evitar que se ejecute dos veces un .exe el cual el proceso esta escondido ??

ó

Como hago para que cuando se cierre mi programa se cierre este proceso ??


Les dejo mi codigo (estoy ejecutando todo desde el dproj):
Código Delphi [-]
program L2exe;


uses Forms,ShellAPI,Windows,TLHelp32,SysUtils,Messages;

const
CM_RESTORE = WM_USER + $1000;

{$R *.res}
var
   RvHandle : hWnd;
   infoInicio : TStartupInfo;
   infoProceso : TProcessInformation;
   numProceso : Integer;
begin

  {Si existe otra instancia ya ejecutandose}

  RvHandle := FindWindow('L2exe.exe', NIL);
  if RvHandle > 0 then
  begin
    Application.Terminate;
  end;

  FillChar (infoInicio, SizeOf(infoInicio), 0);
  infoInicio.cb := SizeOf(infoInicio);
  Application.MessageBox('antes del call procces',
                                'Error', MB_ICONEXCLAMATION);
  if CreateProcess(PChar('L2.exe'), nil,
      nil, nil, false, 0, nil, nil,
      infoInicio, infoProceso) then
   numProceso := infoProceso.hProcess;

   WaitForSingleObject (numProceso, INFINITE);

   Application.Terminate;
end.

ecfisa 13-04-2011 08:02:59

Hola satelier.

Probá de esta forma:
Código Delphi [-]
program Project1;

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

begin {$R *.res}
  (* verificar otra instancia de la aplicación *)
  if (CreateMutex(nil, False, 'Identificador_Unico_Del_Proceso')=0) or
     (GetLastError = ERROR_ALREADY_EXISTS)  then
    Halt(1); 
  // continuar...
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Un saludo.

satelier.martin 14-04-2011 01:04:23

ecfisa, no entendí bien que hace tu código igualmente lo probé y no funciono. Al parece no detecta el L2.exe que se esta escondiendo de la lista de procesos.

Y nisiquiera puedo terminar la ejecucion del mismo cuando terminan la mia abruptamente desde el administrador de atareas de windows.

Me esta comiendo la cabeza :mad:

Gracias por la respuesta.

Saludos.

ecfisa 14-04-2011 01:35:33

Hola.

La función CreateMutex , si bién se usa para controlar secciones críticas en programacion concurrente, en este caso su función es relacionar un identificador único a cada instancia de la aplicación.

En el ejemplo, si encuentra que dicho identificador está presente, aborta la ejecución del programa. Si no, continua la ejecución.

Es por que no depende de la búsqueda de procesos, como las que has utilizado, que te la sugerí.

El ejemplo que te puse es totalmente funcional en situaciones normales, pero al ocultar el proceso puede que tampoco encuentre el identificador y por lo tanto no aborte la ejecución...

Un saludo.


La franja horaria es GMT +2. Ahora son las 22:23:34.

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