使用Windows Mutex功能使应用程序成为一个实例,我想知道如何判断Mutex对象(如果存在)是否拥有'或者不是这样,如果前一个实例崩溃,我可以忽略它是一个有效的对象?
答案 0 :(得分:1)
您的主要目标是拥有该应用程序的单个实例。
bInitialOwner
设置为FALSE
,这样您就可以将其用作标签。例如:
HANDLE Mutex;
DWORD Error;
Mutex = CreateMutex(NULL, FALSE, TEXT("UniqueMutexName"));
Error = GetLastError();
if(Mutex != NULL && Error == ERROR_ALREADY_EXISTS)
{
/* another instance running */
CloseHandle(Mutex);
ExitProcess(0);
}
else if(Mutex == NULL)
{
/* different error */
SetLastError(Error);
}
...
CloseHandle(Mutex);
如果要检查互斥锁是否拥有,可以在零超时时调用WaitForSingleObject
:
switch(WaitForSingleObject(Mutex, 0))
{
case WAIT_ABANDONED:
/* similar to the bellow, but be careful with this one, if
* there's some protected shared data it may left corrupted */
case WAIT_OBJECT_0:
/* was not acquired, you just acquired it */
ReleaseMutex(Mutex);
break;
case WAIT_TIMEOUT:
/* already owned */
break;
default:
/* some error */
}
如果在没有调用CloseHandle
的情况下终止或压缩了该过程,系统将自动关闭句柄,CreateMutex
:
使用
CloseHandle
功能关闭手柄。系统关闭 进程终止时自动处理句柄。互斥对象 在最后一个句柄关闭时被销毁。