我正在使用互斥对象来强制执行单个实例。 在Win 7上我的代码无效。可能是什么原因? 代码在这里
//Test for another instance
HANDLE hMutex = CreateMutex(NULL, TRUE,
_T("Global\\DFFDFD-C1733E55-A6FD-47D5-8638-053E938E08B8"));
if ( hMutex )
{
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
DebugWrite(_T("Another instance of application running. Aborting.\n"));
MessageBeep( 0xFFFFFFFF );
ShowErrorMessage(IDS_ANOTHER_INSTANCE_RUNNING_ABORTING);
CloseHandle( hMutex );
return 0;
}
}
答案 0 :(得分:4)
在互斥锁对象名称之前附加Global \时,表示计算机上的所有用户都可以访问此互斥锁。
虽然如果您使用的是vista或win7计算机,但仍然存在问题,因为升级的应用程序创建的互斥锁将无法被非升级的应用程序访问。
要解决此问题,您可以将SecurityDescriptor指定为createmutex函数的第一个参数,并允许所有人访问。
答案 1 :(得分:1)
实际上这段代码也不起作用,因为CreateMutex
将为Mutex返回非NULL句柄,即使它已经存在。
请参阅MSDN:
如果互斥锁是一个已命名的互斥锁且该对象在此函数调用之前存在,返回值是现有对象的句柄,则GetLastError返回ERROR_ALREADY_EXISTS“。
此代码首先检查hMutex是否为NULL