1

我有以下代码...

在一台机器上它抛出 ERROR_ACCESS_DENIED 而在另一台机器上它抛出 ERROR_ALREADY_EXISTS (句柄不是 NULL)。我想了解为什么有两种不同的行为。在这两台机器上,用户都是本地系统管理员组的域用户。我尝试同时运行三个实例。


#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访问权限。

另请注意,Windows 类型BOOL不同于 C++ 类型bool。所以你应该使用相应的值TRUEFALSE调用 Windows API 函数时BOOL而不是 truefalse

于 2012-08-23T22:23:14.520 回答
1

我猜你得到了ERROR_ALREADY_EXISTSwhen callcreateMyMutex();ERROR_ACCESS_DENIEDwhen calls Lock();。我建议在全局命名空间中选择一个对象名称。所以你最好使用类似的东西

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

有关详细信息,请参阅MSDN 上的对象命名空间

于 2012-08-24T08:14:52.037 回答