Anwendung nur einmal starten

Delphi · ab Delphi XE2 ·

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