3

次のコードは問題なく動作する場合もあれば、「アクセスが拒否されました」というエラーがスローされる場合もあります。動作に一貫性がありません。

_hMutex = CreateMutex(NULL, FALSE, MutexName);
    if (_hMutex == NULL) 
{
  throw MY_ERROR(GetLastError(), L"Error creating mutex handle");
}

このコードを含むスタンドアロンの実行可能ファイルを実行し、操作を行って終了します。マルチスレッド アプリケーションではありません。これを実行するたびに、同じユーザー資格情報でログオンします。

これを解決するのを手伝ってもらえますか?

ありがとう、ヘム

4

4 に答える 4

3

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

ただし、呼び出し元のアクセス権が制限されている場合、関数は失敗し、呼び出し元はOpenMutexERROR_ACCESS_DENIED関数を使用する必要があります。

MSDN

于 2012-04-13T11:32:19.717 に答える
1

これは、ミューテックスがMutexName既に存在するためと考えられます。デフォルトのセキュリティ記述子を使用してミューテックスを作成していますが、(このミューテックスの使用方法によっては) 他の使用が許可されない場合があります。

詳細については、MSDNを参照してください。便利なスニペット:

ミューテックスが名前付きミューテックスであり、オブジェクトがこの関数呼び出しの前に存在していた場合、[省略]、呼び出し元のアクセス権が制限されている場合、関数は失敗し ERROR_ACCESS_DENIED、呼び出し元は OpenMutex 関数を使用する必要があります。

于 2012-04-13T11:33:50.713 に答える
0

やっと見つけました。ミューテックスを作成するシステム アカウントで実行されるサービスと、それにアクセスしようとするユーザーが実行する exe があります。許可があったからです。

于 2013-02-06T14:09:30.120 に答える