![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
MishaUA |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте!
Делаю в программе защиту от повторного запуска. Идея следующая - если запускаем программу второй раз, каким-то образом делаем активным окно первого экземпляра(activateWindow()) и выходим. Отслеживание повторного запуска сделал с помощью QSharedMemory. После запуска в его data() записывается указатель на QMainWindow приложения, но если оказалось, что программа запущена повторно, тогда через QSharedMemory->data() получаем указатель на QMainWindow первого экземпляра и вызываем у него activateWindow(). Собственно, при повторном запуске прога начала вылетать. Где я протупил догло искать не пришлось - в data() же был записан указатель на объект, который находится в области памяти первого экземпляра приложения и так просто к нему достучаться нельзя. Не подскажете, как можно решить данную проблему? |
|
|
![]() |
wiz29 |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
Как вариант можно использовать именованный канал (pipe). Если экземпляру приложения не удалось подключиться к созданному каналу, то оно создает такой канал и считает, что это 1й экземпляр приложения.
Когда обнаруживается повторный запуск, 2й экземпляр спокойно подключается к данному каналу и отправляет нужную команду основному приложению. Такую схему так же удобно использовать для открытия файла по клику в Windows системах когда нужно иметь только 1 экземпляр приложения. В команде в этом слаче передается путь к файлу, который надо открыть. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.5.2025, 20:33 |