Delphi で VB6 アプリケーションを書き直しました。実行中のインスタンスは 1 つだけである必要があります。最小限のコードでこれを行うにはどうすればよいですか?
VB6 では、1 行のコードを使用するだけです >
If App.PrevInstance Then '何らかのアクションを取る End If
ゴーグリングで解決策を見つけましたが、それは非常に長く、.drp ファイルをいじる必要があります。
私はそれをしたくありません。
もっとシンプルなものが欲しい。
Delphi で VB6 アプリケーションを書き直しました。実行中のインスタンスは 1 つだけである必要があります。最小限のコードでこれを行うにはどうすればよいですか?
VB6 では、1 行のコードを使用するだけです >
If App.PrevInstance Then '何らかのアクションを取る End If
ゴーグリングで解決策を見つけましたが、それは非常に長く、.drp ファイルをいじる必要があります。
私はそれをしたくありません。
もっとシンプルなものが欲しい。
次のようなコードがあります。
変数 AppMutex: THandle; { .... } 初期化 // ミューテックスを作成します AppMutex := CreateMutex(nil, True, 'MY-APPLICATION-NAME'); (AppMutex = 0) または (GetLastError = ERROR_ALREADY_EXISTS) の場合 始める MessageDlg('私のアプリケーションはこのコンピューターで既に実行されています'#13#10+ 「新しいインスタンスを開始する前に、他のインスタンスを閉じる必要があります。」,mtError, [mbOK],0); 停止します。 終わり; ファイナライズ // ミューテックスを閉じる CloseHandle(AppMutex);
しかし、@mghie がリンクしているスレッドの回答は、より便利で豊富な機能であると確信しています!
編集:これを独自の小さなユニットにして、そのユニットをプロジェクトで使用できることに注意してください。
多くの場合、ユーザーは、2 番目のインスタンスを起動すると、最初のインスタンスが復元されてフォアグラウンドに移動することを期待することに注意してください。最小化または非表示のアプリを復元することと、ショートカットまたはスタート メニューから起動することの違いをユーザーが理解することを期待しないでください。
私の経験では、アプリケーションを 2 回起動するかどうかを一般的に判断することはできません。たとえば、同じアプリケーションが別のフォルダーまたは別のユーザー アカウントなどで開始された場合、同じアプリケーションを開始することは完全に有効な場合があります。一方、2 つの異なるアプリケーションが同じフォルダーなどで起動された場合、2 つの異なるアプリケーションが一緒に実行されない場合があります。
したがって、ミューテックスとセマフォを使用したさまざまなアプローチと競合状態の処理に加えて、上記の組み合わせを適切に処理するのは、ミューテックスまたはセマフォの名前を賢明に選択することです。
アプリケーションがまったく 2 回実行されない可能性がある場合は、GUID のような名前を使用してください。誰かが名前を変更する可能性を無視できる場合は、exe のファイル名を使用することもできます。
特定のフォルダーでの 1 回限りの起動を制限すると、exe パスを考慮に入れることができますが、マッピングが原因で、異なるパスが同じ exe になる可能性があることに注意してください。