Come garantire che venga eseguita solo una singola istanza della mia applicazione?

Esiste supporto in Delphi XE VCL per garantire che sia in esecuzione una singola istanza di un’applicazione?

In passato, ho usato il codice della libreria per controllare un Mutex che è sempre sembrato complicato. Mentre sto iniziando un nuovo progetto in Delphi XE, mi chiedo se è necessario scavare quel vecchio codice o se c’è già un supporto incorporato in XE? O c’è un altro codice facile da applicare che è bello e moderno?

Io uso JCL per fare questo:

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

La documentazione per questo e lo schema di notifica si trova su JCL Wiki .

Si crea un Mutex con nome all’avvio dell’applicazione. Controlla GetLastError per vedere se un’altra istanza è già in esecuzione.

Inserisci questo codice subito dopo “Inizia” nel tuo file DPR. Sostituisci il GUID con uno dei tuoi. Quando ho bisogno di una costante di testo che è improbabile che venga utilizzata per qualcos’altro, di solito preme Ctrl + G per ottenere un GUID!

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

Potrebbe sembrare che il codice stia perdendo un handle perché non sta salvando il ritorno di CreateMutex . Non è. Windows rilascerà automaticamente l’handle quando la nostra applicazione verrà terminata, e questo è assolutamente perfetto per noi.