Delphi XE VCLには、アプリケーションの単一インスタンスのみが実行されていることを確認するためのサポートがありますか?
以前は、ライブラリコードを使用して、常に複雑に見えていたミューテックスを制御していました。 Delphi XEで新しいプロジェクトを開始しているときに、その古いコードを掘り下げる必要があるのか、それともXEにすでにサポートが組み込まれているのか疑問に思います。それとも、素敵でモダンな別の簡単に適用できるコードはありますか?
私はこれを行うために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は自動的にハンドルを解放しますが、それはまったく問題ありません。