Код нижче також неправильний!! Правильний код, як вище!!
Іноді потрібно дозволити запуск лише одному екземпляру додатка, і коли процес починається, якщо виявляється, що екземпляр додатку запускається, він автоматично припиняє роботу. Зазвичай ми реалізуємо його у функції Main через м'ютекс Mutex, який зазвичай записується так:
Коли ми шукаємо відповіді, ми часто приходимо і йдемо поспіхом, ігноруючи особливості та заходи безпеки Mutex. Після простого тесту — добре, зробіть і використовуйте. На цьому етапі ми пропускаємо важливу передумову:Конвенції найменування mutex. Наведений вище метод написання працює без проблем під одним користувачем; У багатокористувацькому режимі кожен користувач може запускати один екземпляр, тому один екземпляр не може бути гарантований.
Якщо потрібно використовувати його на термінальному сервері і дозволити лише один екземпляр, скористайтеся наступним методом:
Ось опис MSDN:
На серверах, що виконують термінальні сервіси, названий системний м'ютекс може мати два рівні видимості. Якщо ім'я починається з префікса «Global\», м'ютекс видно у всіх сесіях термінального сервера. Якщо ім'я починається з префікса «Local\», м'ютекс видно лише в сесії термінального сервера, який його створив. У цьому випадку кожна інша сесія термінального сервера на сервері може мати окремий м'ютекс з такою ж назвою. Якщо створити іменований м'ютекс без вказання префікса, він візьме префікс "Local\". У сесії термінального сервера два м'ютекси з різними префіксами імен є незалежними м'ютексами, і ці два м'ютекси видно для всіх процесів у сесії термінального сервера. Тобто префікси «Global» і «Local» описують діапазон імені mutex відносно сесії термінального сервера, а не процесу.
|