2012-03-12 9 views
-3

私はmutexオブジェクトを使用して単一インスタンスを実行しています。 勝利7私はコードが動作していません。理由は何でしょうか? コードはここにmutexを使用して単一インスタンスを実行する

//Test for another instance 
HANDLE hMutex = CreateMutex(NULL, TRUE, 
     _T("Global\\DFFDFD-C1733E55-A6FD-47D5-8638-053E938E08B8")); 
    if (hMutex) 
    { 
     if(GetLastError() == ERROR_ALREADY_EXISTS) 
     { 
      DebugWrite(_T("Another instance of application running. Aborting.\n")); 
      MessageBeep(0xFFFFFFFF); 
      ShowErrorMessage(IDS_ANOTHER_INSTANCE_RUNNING_ABORTING); 
      CloseHandle(hMutex); 
      return 0; 
     } 
    } 
+11

NULLでないことをhMutexするための第1のチェックを「動作しない」を定義します。 –

+0

は、ミューテックスが複数作成された手段を動作していません複数回同時に開くことが可能です – SparcU

+0

ミューテックスが作成されたことをどう知っていますか?あなたは 'CreateMutex'の戻り値を決してチェックしません。 –

答えて

4

であるあなたがミューテックスオブジェクト名の前にグローバル\を接続すると、それはこのミューテックスは、コンピュータ上のすべてのユーザーがアクセスであることを意味します。

VistaまたはWin7のコンピュータを使用している場合は、昇格したアプリケーションによって作成されたミューテックスに昇格されていないアプリケーションからアクセスできないため、まだ問題があります。

この問題を解決するには、すべてのユーザーにアクセス許可を持つcreatemutex関数の最初のパラメーターとしてSecurityDescriptorを割り当てることができます。

1

CreateMutexは既に存在していてもMutexのNULLハンドルを返さないため、実際にはこのコードは機能しません。

MSDNを参照してください:

mutexが名前付きミューテックスで、オブジェクトがこの関数の呼び出し前に存在し、戻り値は、既存のオブジェクトへのハンドルです、GetLastError関数が「ERROR_ALREADY_EXISTSを返した場合

そして、このコードは

+0

私はこのコードを使用して、単一インスタンスの実行を強制しました。セキュリティ識別子をコードに追加した後、正常に機能しました。しかし、私がmutexへのアクセスを作成したりアクセスしたりするのに失敗した場合のシナリオは、実際には別のバグです。これを処理するコードを変更しました。 – SparcU

関連する問題