<p>以下のサンプルをダウンロードできるようにしました。3つのサンプルがまとめてアーカイブしてあります。プロジェクトグループでそれぞれを確認するとわかりやすいと思います。プロジェクトグループでの順番はこのぺージの順番と同じにしてあります。</p>
<p>Delphi VCL.Net で .Net Framework の Mutex クラスを使って多重起動防止を実現</p>
<p>Delphi で一番使うケースになるのではないでしょうか？@IT の記事と同じくWindiws 2000 以降ではグローバル Mutex を使用しています。</p>
<pre class="brush: delphi;" title="MutexSample">
const 
  sAppconstName = 'MutexSample'; 
var 
  sMutexName: String; 
  mutexObject: Mutex; 
[STAThread] 
begin 
  if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion &gt;= 5) then 
    sMutexName := 'Global' + sAppconstName 
  else 
    sMutexName := sAppconstName; 
 
  try 
    // ミューテックスを生成する 
    mutexObject := Mutex.Create(false, sMutexName); 
  except 
    on E: Exception {ApplicationException} do 
    begin 
      // グローバル・ミューテックスによる多重起動禁止 
      Application.MessageBox('すでに起動しています。2つ同時には起動できません。', '多重起動禁止'); 
      exit; 
    end; 
  end; 
 
  // ミューテックスを取得する 
  if (mutexObject.WaitOne(0, false)) then 
  begin 
    // アプリケーションを実行 
    Application.Initialize; 
    Application.CreateForm(TForm12, Form12); 
    Application.Run; 
 
    // ミューテックスを解放する 
    mutexObject.ReleaseMutex(); 
  end 
  else 
  begin 
    //  警告を表示して終了 
    Application.MessageBox('すでに起動しています。2つ同時には起動できません。', '多重起動禁止'); 
  end; 
 
  // ミューテックスを破棄する 
  mutexObject.Close(); 
end.
</pre>
<p>Delphi VCL.Net で SyncObjs の TMutex クラスを使って多重起動防止を実現 さきほどと同じ VCL.Net です。ただ SyncObjs の TMutex クラスを利用しています。mutexObject.ReleaseMutex(); に相当する記述がわからず、とりあえず Free しています。もしかするとメモリリークが発生しているかもしれません。 P/Invoke を多用しているようで、美しさで先ほどの例の方が良いかと思います。</p>
<pre class="brush: delphi;" title="MutexSample">
const
  sAppconstName = 'MutexSample';
var
  sMutexName: String;
  Mutex: TMutex;
  MutexAttributes: TSecurityAttributes;
[STAThread]
begin
  if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion &gt;= 5) then     sMutexName := 'Global' + sAppconstName   else     sMutexName := sAppconstName;
  try
    // ミューテックスを生成する
    Mutex := TMutex.Create(MutexAttributes, false, sMutexName);
  except
    on E: Exception {ApplicationException} do
    begin
      // グローバル・ミューテックスによる多重起動禁止
      Application.MessageBox('すでに起動しています。2つ同時には起動できません。', '多重起動禁止');
      exit;
    end;
  end;

  // ミューテックスを取得する
  if (Mutex.WaitFor(0) = wrSignaled) then
  begin
    // アプリケーションを実行
    Application.Initialize;
    Application.CreateForm(TForm12, Form12);
    Application.Run;
    // ミューテックスを解放する
    Mutex.Release;
  end
  else
  begin
    //  警告を表示して終了
    Application.MessageBox('すでに起動しています。2つ同時には起動できません。', '多重起動禁止');
  end;

  // ミューテックスを破棄する
  FreeAndNil(Mutex);
end.
</pre>
<p>Delphi Windows Form で .Net Framework の Mutex クラスを使って多重起動防止を実現 Windows Form での実装例です。Windows Form を利用してプログラムを作成するなら、C# で作成した方が良いかもしれませんね。コードもほとんど変わらないと思います。</p>
<pre class="brush: delphi;" title="MutexSample">
// アプリケーション固定名
const
  sAppconstName: String = 'MutexSample';

// 多重起動を禁止するミューテックス
var
  sMutexName: String;
  mutexObject: Mutex;
  os: OperatingSystem;
[STAThread]
begin
  // Windows 2000（NT 5.0）以降のみグローバル・ミューテックス利用可
  os := Environment.OSVersion;
  if ((os.Platform = PlatformID.Win32NT) and (os.Version.Major &gt;= 5)) then
    sMutexName := 'Global' + sAppconstName
  else
    sMutexName := sAppconstName;

  try
    // ミューテックスを生成する
    mutexObject := Mutex.Create(false, sMutexName);
  except
    on E: Exception {ApplicationException} do
    begin
      // グローバル・ミューテックスによる多重起動禁止
      MessageBox.Show('すでに起動しています。2つ同時には起動できません。', '多重起動禁止');
      exit;
    end;
  end;

  // ミューテックスを取得する
  if (mutexObject.WaitOne(0, false)) then
  begin
    // アプリケーションを実行
    Application.Run(TWinForm.Create);

    // ミューテックスを解放する
    mutexObject.ReleaseMutex();
  end
  else
  begin
    //  警告を表示して終了
    MessageBox.Show('すでに起動しています。2つ同時には起動できません。', '多重起動禁止');
  end;

  // ミューテックスを破棄する
  mutexObject.Close();
end.
</pre>
<p>サンプルプログラムのダウンロードは&rarr;[File:29]</p>