mieki256's diary



2026/01/15(木) [n年前の日記]

#1 [delphi] Delphiで多重起動禁止処理をしたい

Delphi 12 で多重起動禁止処理をしたい。Mutex とやらを使えばいいらしいけど…。

こんな感じでいいのだろうか。コンソールアプリとして作成して試してみた。

program DelphiMutexTest1;

{$APPTYPE CONSOLE}
{$R *.res}
{ 多重起動禁止処理のテスト。Delphiコンソールアプリ }

uses
  System.SysUtils,
  Winapi.Windows;

var
  hMutex: THandle;

const
  APPLIMUTEXID = 'MyConsoleApp_SingleInstance_Mutex';

begin
  try
    {
      Mutex を作成して多重起動禁止処理を行う。
      第二引数を True にすると所有権を要求するが、
      False なら所有権を要求しない。
      多重起動を禁止するだけなら所有権までは要らないらしい。
    }
    hMutex := CreateMutex(nil, False, PChar(APPLIMUTEXID));

    if hMutex = 0 then
    begin
      Writeln('Error : CreateMutex() に失敗。終了します。');

      { ハンドルを取得できてないので CloseHandle() は呼ばなくていい }
      Exit;
    end;

    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Writeln('既にアプリが起動しています。終了します。');

      { ハンドルは取得しているので CloseHandle() を呼ぶ }
      CloseHandle(hMutex);
      Exit;
    end;

    try
      Writeln('アプリを起動しました。');
      Writeln('Press Enter to Exit.');
      Readln;

    finally
      if hMutex <> 0 then
      begin
        {
          所有権を持っているなら ReleaseMutex() をしないといけない。
          今回 CreateMutex() で所有権を要求していないので、
          ReleaseMutex() はしなくていい
        }
        // ReleaseMutex(hMutex);

        { ハンドルは取得しているので CloseHandle() を呼ぶ }
        CloseHandle(hMutex);
        Writeln('Mutex を解放しました。');
      end;
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.


ググっていたら OpenMutex() を使う事例も見かけたけれど、タイミング的にすり抜けてしまう時があるとかなんとか…。多重起動禁止をしたいだけならいきなり CreateMutex() を呼んでしまっていいらしい。

CreateMutex() の第2引数に True を指定して所有権なるものを要求する事例も見かけたけれど、単に多重起動禁止をしたいだけなら False を与えてしまっていいらしい。その場合、所有権は持ってないから ReleaseMutex() も呼ばなくていい、とAIが言っている。ただ、ハンドルは持ってしまっているから CloseHandle() は呼ばないといけない。

コマンドプロンプトを2つ起動して、多重起動してしまうか確認してみたけれど、ちゃんと多重起動禁止状態になってくれた。

以上です。

過去ログ表示

Prev - 2026/01 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project