2011-03-22 23 views
19

¿Existe soporte en Delphi XE VCL para garantizar que solo se ejecute una sola instancia de una aplicación?¿Cómo asegurar que solo se ejecute una sola instancia de mi aplicación?

En el pasado, he utilizado código de la biblioteca para controlar un objeto mutex que siempre ha parecido complicado. Como estoy comenzando un nuevo proyecto en Delphi XE, me pregunto si tengo que desenterrar ese código anterior, o si ya hay soporte integrado en XE. ¿O hay otro código fácil de aplicar que sea agradable y moderno?

+1

¿Qué te hace pensar que crear un mutex no es moderno? – jachguate

+1

He implementado instancias para el siguiente tipo que funciona en varias sesiones de usuario: TEAppSingleInstance = (siSi, siMultipleAcrossUsers, siNo). Sí significa una única instancia en todos los usuarios, no significa que cada usuario puede ejecutar múltiples instancias, y múltiples entre los usuarios significa que cada usuario puede ejecutar solo una instancia para su sesión, pero múltiples usuarios pueden ejecutar la aplicación al mismo tiempo. – Misha

+2

posible duplicado de [¿Cómo puedo saber si otra instancia de mi programa ya se está ejecutando?] (Http://stackoverflow.com/questions/459554/how-can-i-tell-if-another-instance-of-my -program-is-already-running) –

Respuesta

22

utilizo JCL para hacer esto:

program MyProgram; 

uses 
    JclAppInst; 

begin 
    JclAppInstances.CheckSingleInstance; // Added instance checking 
    Application.Initialize; 
    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end. 

Documentación para esto, y el sistema de notificación, es al the JCL Wiki.

+0

+1 para usar JCL. Lo cual se prueba, y algún día, incluso podría ser portátil para diferentes plataformas. –

+0

Gracias - esto tiene la notificación también. No en el VCL, pero es la mejor alternativa. – mj2008

30

se crea un mutex llamado cuando se inicia la aplicación. Compruebe GetLastError para ver si ya se está ejecutando otra instancia.

Pon este código justo después de "comenzar" en su archivo DPR. Reemplace el GUID con uno propio. Cuando necesito una constante de texto que es poco probable que sea utilizado para cualquier otra cosa, por lo general acaba de golpear Ctrl +G para obtener un GUID!

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then 
    RaiseLastOSError; 

if GetLastError = ERROR_ALREADY_EXISTS then 
    Exit; 

Podría verse como el código se está filtrando un mango, ya que no está ahorrando el regreso de CreateMutex. No es. Windows liberará automáticamente el identificador cuando nuestra aplicación finalice, y eso está absolutamente bien para nosotros.

+0

sí, pero ¿hay alguna ayuda en Delphi XE para ello, o todavía es DIY? – mj2008

+4

No necesita soporte 'Delphi XE' específico para dos líneas de la API de Windows. Asegúrese de agregar 'Windows' y' SysUtils' a la cláusula uses de su DPR. –

+0

Ok, mi código anterior trae la otra instancia al frente, pero en este caso no importa. Se aceptará con la nueva edición. – mj2008

Cuestiones relacionadas