Anwendung nur einmal starten
Inhalt
Manche Programme dürfen nur einmal laufen – etwa weil sie eine Datei exklusiv öffnen. Windows bietet dafür einen benannten Mutex: Die erste Instanz legt ihn an, jede weitere stellt fest, dass es ihn schon gibt.
Das Prinzip
CreateMutex liefert auch dann ein gültiges Handle, wenn der Mutex bereits existiert.
Ob man der Erste war, verrät erst GetLastError – und zwar nur, wenn man es
unmittelbar danach abfragt.
Der Code in der .dpr
program Projekt1;
uses
Winapi.Windows,
System.SysUtils,
Vcl.Forms,
Main in 'Main.pas' {FormMain};
{$R *.res}
var
MutexHandle: THandle;
begin
// Name eindeutig wählen – sonst blockiert ein fremdes Programm
MutexHandle := CreateMutex(nil, True, 'DelphiTutorials.Projekt1.EinzigeInstanz');
if MutexHandle = 0 then
RaiseLastOSError;
if GetLastError = ERROR_ALREADY_EXISTS then
begin
CloseHandle(MutexHandle);
Exit;
end;
try
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFormMain, FormMain);
Application.Run;
finally
CloseHandle(MutexHandle);
end;
end.Tipp: Statt still zu beenden, kann die zweite Instanz die erste per FindWindow suchen
und in den Vordergrund holen.
Stolperfallen
- Zwischen
CreateMutexundGetLastErrordarf kein anderer API-Aufruf stehen. - Soll die Sperre über Benutzersitzungen hinweg gelten, braucht der Name das Präfix
Global\.