我有以下代码......
在一台机器上抛出ERROR_ACCESS_DENIED,在另一台机器上抛出ERROR_ALREADY_EXISTS(Handle不为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;
}
答案 0 :(得分:3)
来自MSDN:
如果互斥锁是一个已命名的互斥锁且该对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError返回
ERROR_ALREADY_EXISTS
, bInitialOwner 被忽略,并且调用线程未被授予所有权。但是,如果调用者具有有限的访问权限,则该函数将失败并显示ERROR_ACCESS_DENIED
,并且调用者应使用OpenMutex函数。
因此,请尝试使用OpenMutex
,而只使用SYNCHRONIZE
访问权限。
另请注意,Windows类型BOOL
与C ++类型bool
不同。因此,在调用采用TRUE
,不是 FALSE
和BOOL
的Windows API函数时,您应该使用相应的值true
和false
答案 1 :(得分:1)
我猜您在致电ERROR_ALREADY_EXISTS
时收到createMyMutex();
,拨打ERROR_ACCESS_DENIED
时收到Lock();
。我建议在全局命名空间中选择一个对象名。所以你最好使用像
CreateMutex( NULL, FALSE, "Global\\LockTest" );
有关详细信息,请参阅Object Namespaces on MSDN。