Delphi 多重起動防止 Unit

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

initialization でアプリケーションを正しく終了させる方法があったら、誰か教えて下さい
  1. unit RunOnceUnit;  
  2.   
  3. interface  
  4.     uses Winapi.Windows, System.SysUtils;  
  5.   
  6. var MutexAlreadyExists: Boolean = False;  
  7.   
  8. implementation  
  9.   
  10. var MutexHandle: THandle;  
  11.   
  12. initialization  
  13.     MutexHandle := CreateMutex(nil, False, PChar(ExtractFileName(ParamStr(0))));  
  14.     MutexAlreadyExists := (MutexHandle <> 0and (GetLastError() = ERROR_ALREADY_EXISTS);  
  15.   
  16. finalization  
  17.     if (MutexHandle <> 0then begin  
  18.         ReleaseMutex(MutexHandle);  
  19.     end;  
  20.   
  21. end.   

使い方(アプリケーションのメインユニットで)
  1. program HOGEHOGE;  
  2.   
  3. uses  
  4.   Vcl.Forms,  
  5.   RunOnceUnit, // ユニット追加  
  6.   Unit1 in 'Unit1.pas' {Form1},  
  7.    
  8. {$R *.res}  
  9.   
  10. begin  
  11.     // ↓既に実行されていれば終了↓  
  12.     if MutexAlreadyExists then begin   
  13.         Exit;  
  14.     end;  
  15.     // ↑既に実行されていれば終了↑  
  16.   
  17.   Application.Initialize;  
  18.   Application.MainFormOnTaskbar := True;  
  19.   Application.CreateForm(TForm1, Form1);  
  20.   Application.Run;  
  21. end.  

コメント