-1

私はWindowsアプリケーションを開発しています。私が望むのは、このアプリケーションが単一の OS で複数実行されるのを防ぐことです。(たとえば、notepad.exe、calc.exe の複数のインスタンスを同時に実行できます... しかし、これは望ましくありません) これを実装する最も効果的な方法は何ですか?(プロセスの複数のインスタンスが同時に実行されるのを防ぐ)

プロセス名をチェックしたり、グローバルファイルをシグナルとして共有したりするような方法は使用したくありません...回避するのは簡単すぎるためです

前もって感謝します

4

3 に答える 3

0

現在のプロセス名を確認したり、グローバル ファイルを使用したりしたくないとおっしゃいました。

現在の実行可能ファイルをロックする

.NET サンプル コード:

        System.IO.File.Open(
            System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName,
            System.IO.FileMode.Open,
            System.IO.FileAccess.Read,
            System.IO.FileShare.None);

FileShare.None は、アプリが終了するか、ファイル ハンドル (返されるオブジェクト) が明示的に閉じられるまで、他のプロセス (Windows エクスプローラーなど) がファイルを実行できないようにします。

グローバル ミューテックス

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411%28v=vs.85%29.aspx

ミューテックスが名前付きミューテックスであり、この関数呼び出しの前にオブジェクトが存在していた場合、戻り値は既存のオブジェクトへのハンドルであり、GetLastError は ERROR_ALREADY_EXISTS を返し、bInitialOwner は無視され、呼び出しスレッドには所有権が付与されません。ただし、呼び出し元のアクセス権が制限されている場合、関数は ERROR_ACCESS_DENIED で失敗し、呼び出し元は OpenMutex 関数を使用する必要があります。

グローバルミューテックスは最も簡単な方法です。別の答えを明確にするために、戻り値をチェックするだけでなく、GetLastError 値もチェックします。

于 2013-06-04T17:42:03.627 に答える