web-dev-qa-db-ja.com

アプリケーションのインスタンスを1つだけ実行するようにするにはどうすればよいですか?

Delphi XE VCLには、アプリケーションの単一インスタンスのみが実行されていることを確認するためのサポートがありますか?

以前は、ライブラリコードを使用して、常に複雑に見えていたミューテックスを制御していました。 Delphi XEで新しいプロジェクトを開始しているときに、その古いコードを掘り下げる必要があるのか​​、それともXEにすでにサポートが組み込まれているのか疑問に思います。それとも、素敵でモダンな別の簡単に適用できるコードはありますか?

28
mj2008

私はこれを行うためにJCLを使用します:

program MyProgram;

uses
  JclAppInst;

begin
  JclAppInstances.CheckSingleInstance; // Added instance checking
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

これに関するドキュメントと通知スキームは JCL Wiki にあります。

アプリケーションを起動するときに、名前付きミューテックスを作成します。 GetLastErrorをチェックして、他のインスタンスがすでに実行されているかどうかを確認します。

このコードは、DPRファイルの「開始」の直後に配置します。 GUIDを独自のものに置き換えます。他の用途に使用される可能性が低いテキスト定数が必要な場合は、通常、 Ctrl+G GUIDを取得するには!

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then
  RaiseLastOSError;

if GetLastError = ERROR_ALREADY_EXISTS then
  Exit;

CreateMutexの戻り値を保存していないため、コードがハンドルをリークしているように見える場合があります。そうではありません。アプリケーションが終了すると、Windowsは自動的にハンドルを解放しますが、それはまったく問題ありません。

35
Cosmin Prund