1

私は次のコードを持っています...

あるマシンでは ERROR_ACCESS_DENIED をスローし、別のマシンでは ERROR_ALREADY_EXISTS をスローします (ハンドルが NULL ではありません)。2 つの異なる動作の理由を理解したいと思います。両方のマシンで、ユーザーはローカル システム管理者グループのドメイン ユーザーです。3 つのインスタンスを同時に実行してみました。


#include <windows.h>
#include<iostream>
using namespace std;

void * _hMutex = NULL;

void createMyMutex()
{
    _hMutex = CreateMutex( 
            NULL,              // default security attributes
            false,             // initially not owned
            L"LockTest");      // named mutex

        if (_hMutex == NULL) 
        {
            cout<< GetLastError()<< " Error creating mutex handle"<<endl;
            Exit(0);
        }
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
            cout<< GetLastError()<< " Mutex already created" <<endl;
        }   
}

void Lock()
{
    cout<<"Acquiring Lock..."<< endl;
    if(_hMutex != NULL)
        WaitForSingleObject(_hMutex, INFINITE);
    cout<< "Acquired Lock." <<endl;
}

void Unlock()
{
cout<< "Releasing Lock..." <<endl;
    if(_hMutex != NULL)
       ReleaseMutex(_hMutex);
}


int main(int argc, char* argv[])
{

    cout<<"Creating lock"<<endl;
    createMyMutex();
    cout<<"Lock create success"<<endl;

    cout<<"Taking lock"<<endl;
    Lock();
    cout<<"Got the lock"<<endl;

    cout<<"Waiting for 20 seconds"<<endl;
    Sleep(20000);
    cout<<"Wait over"<<endl;


    cout<<"Releasing lock"<<endl;
    Unlock();
    cout<<"Lock released successfully"<<endl;

    cout<<"exiting the program"<<endl;
    return 0;
    }

4

2 に答える 2

3

MSDNから:

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

OpenMutexそのため、代わりにSYNCHRONIZEアクセス権だけを使用してみてください。

BOOLまた、Windows 型は C++ 型とは異なることに注意してくださいbool。したがって、 とではなくを取る Windows API 関数を呼び出すときは、対応する値TRUEとを使用する必要があります。FALSEBOOL truefalse

于 2012-08-23T22:23:14.520 に答える
1

ERROR_ALREADY_EXISTSwhen callingcreateMyMutex();ERROR_ACCESS_DENIEDwhen calling を取得していると思いますLock();。グローバル名前空間でオブジェクト名を選択することをお勧めします。したがって、次のようなものを使用することをお勧めします

CreateMutex( NULL, FALSE, "Global\\LockTest" );

詳細については、MSDNのオブジェクトの名前空間を参照してください。

于 2012-08-24T08:14:52.037 に答える