Использование мьютекса для принудительного применения одного экземпляра - PullRequest
0 голосов
/ 12 марта 2012

Я использую объект взаимного исключения для принудительного применения одного экземпляра.На 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 ]

4 голосов
/ 12 марта 2012

Когда вы присоединяете Global \ к имени объекта мьютекса, это означает, что этот мьютекс доступен всем пользователям компьютера.

Хотя, если вы работаете на компьютере Vista или Win7, у вас все еще есть проблемы, потому что мьютекс, созданный приложением с повышенными правами, не будет доступен для приложения без повышенных прав.

Чтобы преодолеть эту проблему, вы можете назначить SecurityDescriptor в качестве первого параметра функции createmutex с разрешением доступа для всех.

1 голос
/ 10 апреля 2014

На самом деле этот код тоже не работает, потому что CreateMutex будет возвращать не дескриптор NULL для Mutex, даже если он уже существует.

См. MSDN :

Если мьютекс является именованным мьютексом и объект существовал до этого вызова функции, возвращаемое значение является дескриптором существующего объекта , GetLastError возвращает ERROR_ALREADY_EXISTS ".

И этот код сначала проверяет, что hMutex не равен NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...