Russian Qt Forum
Ноябрь 23, 2024, 14:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Запуск одной копии программы + Показ первой копии  (Прочитано 16858 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Август 19, 2012, 01:19 »

Здравствуйте!
Как сделать так что при повторном запуске ехе программы, не создавался новый процесс, а
1-ая копия показывалась юзеру?

Нашел пример похожего: http://www.prog.org.ru/topic_2630_0.html

есть у меня программа, при запуске, показывается сплеш-скрин, потом программа видна в трее, и хочется чтобы при повторном запуске, окно программы показывалось

выглядит main так:
Код:
#include <QtGui/QApplication>
#include <windows.h>
#include "UManager.h"

int main(int argc, char *argv[])
{
    HANDLE mutex;
    LPCWSTR mtxname = L"Mutex";
    if(OpenMutex(MUTEX_ALL_ACCESS, false, mtxname) != 0)
    {
        return -1;
    }else
    {
        mutex = CreateMutex(0, false, mtxname);
    }

    QApplication a(argc, argv);

    QPixmap *pixmap = new QPixmap(":/images/splash.png");

    QSplashScreen *splash = new QSplashScreen(*pixmap);
    splash->show();

    a.processEvents();

    splash->showMessage("initialization...", Qt::AlignRight);

    UManager *manager = new UManager();

    splash->finish(manager);

    delete pixmap;
    delete splash;

    a.setQuitOnLastWindowClosed(false);

    ReleaseMutex(mutex);

    return a.exec();
}
« Последнее редактирование: Ноябрь 11, 2012, 20:28 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Август 19, 2012, 02:00 »

раз используется Qt, то можно воспользоваться QtSingleApplication
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Август 19, 2012, 02:02 »

Если я не ошибаюсь это сторонняя библиотека и ее нужно скачивать?
Кроме того, хоть и использую Qt, но не скоро моя программа будет на ос кроме винды - пришлось достаточно много использовать винапи, и посмотрев на форуме про QtSingleApplication, понял что с ним слишком много геммороя, и для моего случая проще и удобнее использовать винапишные методы Улыбающийся
« Последнее редактирование: Август 19, 2012, 02:11 от gil9red » Записан

Bepec
Гость
« Ответ #3 : Август 19, 2012, 10:12 »

Ну тогда вин апи тебе в руки.
1) Получаешь список процессов, сравниваешь названия, если есть - получаешь его id и показываешь
2) в момент запуска 1 программы создаёшь скрытый файл аля - я уже запущена, мой id = *******.
3) использовать sharedMemory вроде - кто-то говорил, с ними тоже можно, но тут уж за что купил - за то и продаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 19, 2012, 11:30 »

есть у меня программа, при запуске, показывается сплеш-скрин, потом программа видна в трее, и хочется чтобы при повторном запуске, окно программы показывалось
Ну и действуйте в WinAPI если так хочется
Код
C++ (Qt)
   ...
   if(OpenMutex(MUTEX_ALL_ACCESS, false, mtxname) != 0)
   {
       HWND wnd = FindWindow(mtClass, myTitle);
       if (myWnd) {
         if (IsIconic(wnd)) ShowWindow(wnd, SW_RESTORE):
         SetForegroundWindow(wnd);  
       }
       return -1;
   }
   ...
 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Август 19, 2012, 15:37 »

Igors, винапишная функция поиск окна вряд ли сможет прокатить Грустный, ведь у меня не одно название окна, которое нужно показать - программа мультиязычная, и заголовок тоже меняется
кроме того, после проверки выяснилось, что чтобы окно первой копии показалось, сначало его нужно показать ("вытащить из трея"), а потом снова спрятать и тогда ваш код работает, но содержимое окна не обновляется оконным менеджером, там всякий мусор отпечатавшийся с фона
Может pipe сообщения прокатят...

в notepad++ реализовано, то что я спрашивал, при запуске второй копии, вторая игнорируется и показывается первая
Записан

LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Август 19, 2012, 15:52 »

Может pipe сообщения прокатят...
А pipe в Qt - это QLocalSocket.
А через QLocalSocket реализован QtSingleApplication.
Ну вы понимаете, к чему я клоню Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Август 19, 2012, 16:22 »

Угу Плачущий
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Август 19, 2012, 17:23 »

с QtSingleApplication никаких проблем под виндой нету, разве что при компиляции через студию (по крайней мере 2010) придётся пару файлов не добавлять в проект (я боролся с этим тут).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 19, 2012, 17:53 »

Igors, винапишная функция поиск окна вряд ли сможет прокатить Грустный, ведь у меня не одно название окна, которое нужно показать - программа мультиязычная, и заголовок тоже меняется
кроме того, после проверки выяснилось, что чтобы окно первой копии показалось, сначало его нужно показать ("вытащить из трея"), а потом снова спрятать и тогда ваш код работает, но содержимое окна не обновляется оконным менеджером, там всякий мусор отпечатавшийся с фона
Может pipe сообщения прокатят...
Не знаю, у меня все работает (Win XP 64), правда приложение не использует Qt. Можно попробовать RedrawWindow - а проще не упираться и задействовать QtSingleApplication
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Август 30, 2012, 23:19 »

Вот я и вернулся Улыбающийся
потерпел фиаско, пытался провернуть с pipe и винапи, но компилятор оказался упрямее меня и не захотел компилить, в итоге удалил нафиг в корзину Веселый

решил попробовать как и советовали более опытные люди qtsingleapplication Улыбающийся
скачал заголовочные и исходники для него, добавил в проект, немного изменил main как в примере, при компиляции сборки Отладка, все ок, все работает, при релизе появляется ошибка Microsoft Visual C++ Runtime и в консоле вывода приложения сообщение о не совпадении версий библиотек Qt:
Cannot mix incompatible Qt library (version 0x40801) with this library (version 0x40800)

Разве либы qtsingleapplication не используют либы qt, установленного у меня?
откуда эта ошибка?
как с ней справиться?

Не, конечно, можно и дебаг оставить, но вряд ли кому то понравится качать непонятные dll, весящие в 150раз больше самого ехе Смеющийся
« Последнее редактирование: Август 30, 2012, 23:22 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Август 31, 2012, 00:07 »

создай пустой проект и проверь будет ли в нём работать qtsingleapplication
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Август 31, 2012, 00:39 »

Сделал, при отладке все прекрасно работает

в pro файле есть нетворк:
QT += core gui network

main:
Код:
#include "qtsingleapplication/qtsingleapplication.h"
#include <QWidget>

int main(int argc, char **argv)
{
    QtSingleApplication instance(argc, argv);
    if(instance.sendMessage("Wake up!"))
        if(instance.isRunning())
            return 0;

    QWidget w;

    instance.setActivationWindow(&w);
    
    w.show();

    QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
             &w, SLOT(setWindowTitle(QString&)));

    return instance.exec();
}

могу скинуть этот проект, но проблема похоже у меня
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Август 31, 2012, 00:46 »

а проекты без QtSingleApplication нормально работают в релизе я так понимаю? может в PATH есть что-то с устаревшими библиотеками (подозреваю, что проблема в QtNetwork4.dll)?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Август 31, 2012, 00:53 »

Да, до qtsingleapplication все проекты компилировались без проблем и в релизе, и в отладке
У меня в PATH был путь к папке minGW к dll, но я оттуда сейчас убрал/сохранил, не помогло
может нужно ребутнуть комп?
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.175 секунд. Запросов: 23.