Заборона запуску копії сторонньої програми

Якось у мене на роботі виникла проблема — деякі співробітники примудрялися запускати кілька копій програм. Запуск кількох копій, звичайно, не приводив до катастрофічних результатів, але іноді породжував різні «глюки», нестабільну роботу програми. Це, звичайно, додавало мені головного болю від численних скарг на ці глюки.
Насамперед я провів роз'яснювальну бесіду зі співробітниками про проблему запуску копій програми та про те, як цього уникнути. Цей захід допоміг на найближчі пару днів, а далі все повернулося на круги свої. Скаржитися начальству на таке потурання деяких працівників загрожує моїм звільненням, т.к. начальство шалено цінувало цих працівників, а до мене ставлення було кардинально протилежним.
Як говориться «Якщо гора не йде до Магомета, то Магомет йде до гори». Я вирішив сам програмно заборонити запуск копій програми. Завдання виявилося не тривіальним.
Простий аналіз виявив 2 особливості моєї ситуації: По-перше, у мене додаток стороннє, тобто. його розробник не наша організація і доступу до вихідного коду немає (поясню, додаток - один із продуктів Microsoft). Будь-яких регулюючих запуск налаштувань та параметрів додаток не має. По-друге, програма запускається не безпосередньо, а як програма за промовчанням для відкриття файлів певного розширення. Тобто програма запускається з параметром (шлях файлу даних, який потрібно відкрити).
Рішення – теорія
Пошук у Інтернеті не дав мені явного рішення. Заборона запуску другої копіїпрограми у вигляді системних налаштувань, як я зрозумів, не існує (хоча є API). Також я знайшов десятки прикладів реалізації mutex-ів різними мовами програмування, але всі вони, природно, вимагали внесення змін до коду і мені не підходили. Треба було шукати своє оригінальне рішення і бажано простіше.
Єдине рішення, яке я бачив, було створення своєрідного «прошарку» між користувачем та додатком. Повинно відбуватися такі:
- Користувач ініціює запуск програми, відкриваючи файл даних, що асоціюється з програмою.
- За замовчуванням замість потрібної програми запускається програма-прошарок.
- Ця програма отримує у вигляді параметра шлях до файлу даних, створює mutex і запускає необхідну програму з отриманими параметрами. Додаток-прошарку, відповідно, повинен бути прихований.
- Далі запускається необхідний додаток і користувач працює у ньому. Додаток-прошарку весь цей час продовжує роботу. Його mutex блокує спроби запустити копію.
- Після закінчення роботи користувач закриває основну програму. Програма-прошарка закривається автоматично.
Рішення – практика
Практичне рішення наведено для додатка «Блокнот» (зрозуміло, що на його місці може бути будь-яка програма).
Програмний код скрипта (текстовий файл з розширенням .au3) не становить нічого складного:
Далі все елементарно - поміщаємо додаток-прошарку, що вийшов, в яку-небудьдиректорію та налаштовуємо відкриття за умовчанням для файлів даних (у прикладі для файлів з розширенням .txt) за допомогою цієї програми-прошарку.
На цьому все. Перевіряємо та радіємо вирішеному завданню — тепер ніхто не зможе запустити дві копії «Блокнота».
Післямова
Цей спосіб дозволив мені вирішити проблему подвійного запуску програм. Щоправда, наступного дня після встановлення програми-прошарку до мене прибігли недбалі співробітники зі словами «Воно не запускається». Довелося провести роз'яснювальну бесіду зі співробітниками на тему «Додаток не запускається, бо вже запущено». Ця розмова виявилася значно ефективнішою, т.к. особливого вибору співробітники не мали. Вже майже місяць цих проблем не виникало.
Якщо хтось із читачів знає спосіб написати mutex у вигляді .bat файлу для даної задачі, то поділіться досвідом. Я маю підозру, що такий спосіб є.
Хардкорна конфа за С++. Ми запрошуємо лише профі.