Russian Qt Forum

Qt => Общие вопросы => Тема начата: яков от Март 22, 2006, 15:25



Название: Как сделать чтобы запускался только один экземпляр программы
Отправлено: яков от Март 22, 2006, 15:25
Как сделать чтобы запускался только один экземпляр программы.

Спасибо


Название: Как сделать чтобы запускался только один экземпляр программы
Отправлено: Sergeich от Март 22, 2006, 17:16
В Solutions есть класс QtSingleApplication


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: deMax от Октябрь 18, 2013, 10:48
А если у программы есть еще один режим(при запуске с параметром, и само приложение немного отличается)?
Т.е. приложение без параметров может существовать в единственном варианте, а запуск с параметром любое количество раз.


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: kambala от Октябрь 18, 2013, 14:22
ну используй QtSingleApplication и просто не выходи из main если есть параметр да и все


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: deMax от Октябрь 18, 2013, 15:41
А как определить тип уже запущенного приложения (с параметрами его запустили или без).


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: Old от Октябрь 18, 2013, 15:51
А как определить тип уже запущенного приложения (с параметрами его запустили или без).
У QtSingleApplication вроде есть sendMessage и сигнал messageReceived для общения между instances.


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: deMax от Октябрь 28, 2013, 12:00
Сделал пока так, но периодически приложение вылетает(то нормально скомпилит, то при запуске сразу ошибка)
Код:
#if defined(Q_WS_WIN)
#include "windows.h"
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    Q_UNUSED(lParam);
    WCHAR  title[80];
    GetWindowText(hwnd,title,sizeof(title));
    QString sTitle, cTitle;
#ifdef UNICODE
sTitle = QString::fromWCharArray(title);
#else
sTitle = QString::fromLocal8Bit(title);
#endif
    cTitle = Program::getName();

    if(sTitle == cTitle) return false;
    return true;
}

bool checkProcess()
{
    return EnumWindows(EnumWindowsProc, NULL);
}

#elif defined(Q_WS_X11)
bool checkProcess() { return true; }
#endif


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: Alex Custov от Октябрь 28, 2013, 12:57
Цитировать
GetWindowText(hwnd,title,sizeof(title));

Переполнение буфера, и код возврата не проверяется. Если уж есть #ifdef UNICODE, то и TCHAR нужно вместо WCHAR.


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: Serr500 от Октябрь 28, 2013, 14:38
Лучше так:
Код:
bool Result = true;
int len = GetWindowTextLength(hwnd);
if (len > 0)
{
    LPTSTR title = new TCHAR[++len];
    if (GetWindowTextW(hwnd, title, len) > 0)
    {
        Result = QString::fromWCharArray(title) != Program::getName();
    }
    else {
        // Ошибка при получении заголовка окна
    }
    delete title;
}
else {
    // Либо заголовок пуст, либо ошибка.
}
return Result;


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: deMax от Октябрь 28, 2013, 15:05
Alex Custov , Serr500 , спасибо. Давно не работал с винапи и уже забыл, неудачный скопипастенный пример.

return !Result; - здесь нужно отрицание.


Название: Re: Как сделать чтобы запускался только один экземпляр программы
Отправлено: Serr500 от Октябрь 28, 2013, 15:19
return !Result; - здесь нужно отрицание.
Упс... Недосмотрел. Исправил.