Код ниже тоже неверен!! Правильный код, как выше!!
Иногда нужно позволить запуск только одному экземпляру приложения, и при запуске процесса, если обнаруживается, что один экземпляр приложения запущен, он автоматически останавливается. Обычно мы реализуем его в функции Main через мьютекс Mutex, который обычно записывается следующим образом:
Когда мы ищем ответы, мы часто приходим и уходим в спешке, игнорируя особенности и меры предосторожности Mutex. После простого теста, хорошо, возьмите и используйте. На данном этапе мы упускаем из виду важное условие:Конвенции наименования mutex. Вышеуказанный метод записи работает без проблем при одном пользователе; При многопользовательском режиме каждый пользователь может запустить одну экземплярию, поэтому один экземпляр не может быть гарантирован.
Если вам нужно использовать его на терминальном сервере и разрешать только одну экземпляр, используйте следующий способ:
Вот описание MSDN:
На серверах, использующих терминальные сервисы, именованный системный мьютекс может иметь два уровня видимости. Если имя начинается с префикса «Global\», мьютекс виден во всех сессиях терминального сервера. Если имя начинается с префикса «Local\», мьютекс виден только в сессии терминального сервера, который его создал. В этом случае каждая сессия терминального сервера на сервере может иметь отдельный мьютекс с таким же именем. Если создать именованный мьютекс без указания префикса, он возьмёт префикс «Local\». В сессии терминального сервера два мьютека с разными префиксами названия являются независимыми мьютексами, и два мьютекса видны всем процессам сессии терминального сервера. То есть префиксы «Global» и «Local» описывают диапазон имени mutex относительно сессии терминального сервера, а не процесса.
|