使用互斥锁强制执行单个实例

时间:2012-03-12 00:09:18

标签: c++ windows winapi

我正在使用互斥对象来强制执行单个实例。 在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;
       }
    } 

2 个答案:

答案 0 :(得分:4)

在互斥锁对象名称之前附加Global \时,表示计算机上的所有用户都可以访问此互斥锁。

虽然如果您使用的是vista或win7计算机,但仍然存在问题,因为升级的应用程序创建的互斥锁将无法被非升级的应用程序访问。

要解决此问题,您可以将SecurityDescriptor指定为createmutex函数的第一个参数,并允许所有人访问。

答案 1 :(得分:1)

实际上这段代码也不起作用,因为CreateMutex将为Mutex返回非NULL句柄,即使它已经存在。

请参阅MSDN

  

如果互斥锁是一个已命名的互斥锁且该对象在此函数调用之前存在,返回值是现有对象的句柄,则GetLastError返回ERROR_ALREADY_EXISTS“。

此代码首先检查hMutex是否为NULL