Предотвратяване на стартиране на копие на приложение на трета страна
Много софтуерни програмисти са изправени пред предизвикателството да предотвратят изпълнението на копия на приложение. Това се прави за различни цели и зависи от ситуацията. Дори има отделен термин за решаване на този проблем - Mutex.Веднъж имах проблем на работа - някои служители успяха да пуснат няколко копия на приложения. Изпълнението на няколко копия, разбира се, не доведе до катастрофални резултати, но понякога пораждаше различни „бъгове“, нестабилна работа на програмата. Това, разбира се, увеличи главоболието ми от многобройните оплаквания за тези "бъгове".
Преди всичко проведох разяснителен разговор със служители за проблема с стартирането на копия на приложението и как да го избегна. Тази мярка помогна през следващите няколко дни и след това всичко се нормализира. Оплакването на властите за такова съучастие на някои служители беше изпълнено с моето уволнение, защото. шефовете безумно ценяха тези работници, а отношението към мен беше коренно противоположно.
Както се казва: "Тъй като планината не отива при Мохамед, тогава Мохамед отива при планината." Реших сам програмно да деактивирам стартирането на копия на приложението. Задачата се оказа нетривиална.
Прост анализ разкри 2 характеристики на моята ситуация: Първо, имам приложение на трета страна, т.е. неговият разработчик не е наша организация и няма достъп до изходния код (ще поясня, приложението е един от продуктите на Microsoft). Приложението няма настройки и параметри, които регулират стартирането. Второ, приложението не се стартира директно, а като програма по подразбиране за отваряне на файлове с определено разширение. Тоест, приложението се стартира с параметър (пътя на файла с данни, който трябва да се отвори).
Решение - теория
Търсенето в мрежата не ми даде ясно решение. Предотвратете стартирането на второ копиеприложения под формата на системни настройки, както разбирам, не съществуват (въпреки че има API). Намерих и десетки примери за реализации на mutex в различни езици за програмиране, но всички те, разбира се, изискваха промени в кода и не ми подхождаха. Трябваше да търся моето оригинално решение и за предпочитане по-просто.
Единственото решение, което видях, беше да се създаде един вид "слой" между потребителя и приложението. Трябва да се случи следното:
- Потребителят инициира стартирането на приложение, като отвори файл с данни, свързан с приложението.
- По подразбиране се стартира приложение за слой вместо необходимото приложение.
- Това приложение получава пътя до файла с данни като параметър, създава mutex и стартира необходимото приложение с получените параметри. Приложният слой, съответно, трябва да бъде скрит.
- След това се стартира необходимото приложение и потребителят работи в него. Приложението за междинен слой продължава да работи през цялото това време. Мутексът му блокира опитите за стартиране на копие.
- В края на работата потребителят затваря основната програма. Програмата за междинен слой се затваря автоматично.
Решение - практика
Дадено е практично решение за приложението Notepad (разбира се, всяко приложение може да бъде на негово място).
Програмният код на скрипта (текстов файл с разширение .au3) не е нищо сложно:
Освен това всичко е елементарно - поставяме полученото приложение на слоя в някоидиректория и конфигурирайте отварянето по подразбиране за файлове с данни (в примера за файлове с разширение .txt), като използвате това приложение на слоя.
Това е всичко. Проверяваме и се радваме на решен проблем - сега никой няма да може да стартира две копия на Notepad.
Послеслов
Този метод ми позволи да реша проблема с двойното стартиране на приложения. Вярно е, че на следващия ден след инсталирането на приложението за слой, небрежни служители дотичаха при мен с думите „Не стартира“. Трябваше да проведа разяснителен разговор със служители на тема „Приложението не стартира, защото вече работи“. Този разговор се оказа много по-ефективен, т.к. Персоналът нямаше голям избор. Вече почти месец нямам нито един от тези проблеми.
Ако някой читател знае начин да напише mutex като .bat файл за тази задача, моля, споделете своя опит. Имам подозрение, че има такъв начин.
Hardcore conf в C++. Каним само професионалисти.