Дорогие коллеги...
Если администрация не будет возражать, прошу подчистить тему и прикрепить ее.
Ответ.
Используем:
https://doc.qt.io/qt-5/qsystemsemaphore.htmlПример:
/*
* Блок реализация повторного запуска программы, реализован как
* кроссплатформенная составляющая из классов QT
* *
QSystemSemaphore semaphore("EANG41RT723PHKK1IANFGQMY", 1); // создаём семафор
semaphore.acquire(); // Поднимаем семафор, запрещая другим экземплярам работать с разделяемой памятью
#ifndef Q_OS_WIN32
/* в linux разделяемая память не освобождается при аварийном завершении приложения,
* поэтому необходимо избавиться от данного мусора
* */
QSharedMemory nix_fix_shared_memory("WEY247Y5U43HTFAG0H4DKH99");
if(nix_fix_shared_memory.attach()){
nix_fix_shared_memory.detach();
}
#endif
QSharedMemory sharedMemory("WEY247Y5U43HTFAG0H4DKH99"); // Создаём экземпляр разделяемой памяти
bool is_running; // переменную для проверки уже запущенного приложения
if (sharedMemory.attach()){ // пытаемся присоединить экземпляр разделяемой памяти к уже существующему сегменту
is_running = true; // Если успешно, то определяем, что уже есть запущенный экземпляр
}else{
sharedMemory.create(1); // В противном случае выделяем 1 байт памяти
is_running = false; // И определяем, что других экземпляров не запущено
}
semaphore.release(); // Опускаем семафор
// Если уже запущен один экземпляр приложения, то сообщаем об этом пользователю
// и завершаем работу текущего экземпляра приложения
if(is_running){
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText(QObject::tr("Приложение уже запущено.\n Вы можете запустить только один экземпляр приложения."));
msgBox.exec();
return 1;
}
/*
* Завершение блока проверки повторного запуска программы
* */
Пример рассчитан на использование в ОС WInx32 & Linx64 (MacOs и другие платформы в примере не учитывалась)
более детально можно посмотреть:
https://doc.qt.io/qt-5/qtglobal.html https://doc.qt.io/qt-5/qsharedmemory.htmlПример описывает запуск одного экземпляра приложения от имени одного пользователя.
Дальнейшее решение основывается на счетчике семафора (по количеству запущенных экземпляров) и
пользователю (которого можно идентифицировать системно, в рамках одного сервера, рабочей станции или как клиент серверные подключения)
По вопросу дополнительных инсталляций - есть только один действенный метод на текущий момент:
Регистрация (онлайн проверка) через сервер лицензий с привязкой к серийным номерам оборудования (и прочего...).
По поводу взлома (патчинга и прочего) считаю что ПО обновляется и дорабатывается постоянно, а кому нужен устаревший софт пусть пользуется...
Разработчик тратит средства на выпуск ПО, рекламу, доработку (обеспечивает рабочие места, нам программистам).