2015/09/08

Delphi 多重起動防止 Unit

多重起動防止に度々 Mutex も面倒なので Unit を作成 initialization と finalization を利用して簡素化してみた
パスを含まない実行ファイル名をキーに Mutex を作成している
※パスを含んだ実行ファイル名をキーにする場合は ¥ を別の文字列に変更する必要あり

initialization でアプリケーションを正しく終了させる方法があったら、誰か教えて下さい
unit RunOnceUnit;

interface
    uses Winapi.Windows, System.SysUtils;

var MutexAlreadyExists: Boolean = False;

implementation

var MutexHandle: THandle;

initialization
    MutexHandle := CreateMutex(nil, False, PChar(ExtractFileName(ParamStr(0))));
    MutexAlreadyExists := (MutexHandle <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS);

finalization
    if (MutexHandle <> 0) then begin
        ReleaseMutex(MutexHandle);
    end;

end. 

使い方(アプリケーションのメインユニットで)
program HOGEHOGE;

uses
  Vcl.Forms,
  RunOnceUnit, // ユニット追加
  Unit1 in 'Unit1.pas' {Form1},
 
{$R *.res}

begin
    // ↓既に実行されていれば終了↓
    if MutexAlreadyExists then begin 
        Exit;
    end;
    // ↑既に実行されていれば終了↑

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

0 件のコメント: