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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать чтобы запускался только один экземпляр программы  (Прочитано 8328 раз)
яков
Гость
« : Март 22, 2006, 15:25 »

Как сделать чтобы запускался только один экземпляр программы.

Спасибо
Записан
Sergeich
Гость
« Ответ #1 : Март 22, 2006, 17:16 »

В Solutions есть класс QtSingleApplication
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Октябрь 18, 2013, 10:48 »

А если у программы есть еще один режим(при запуске с параметром, и само приложение немного отличается)?
Т.е. приложение без параметров может существовать в единственном варианте, а запуск с параметром любое количество раз.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Октябрь 18, 2013, 14:22 »

ну используй QtSingleApplication и просто не выходи из main если есть параметр да и все
Записан

Изучением 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
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Октябрь 18, 2013, 15:41 »

А как определить тип уже запущенного приложения (с параметрами его запустили или без).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Октябрь 18, 2013, 15:51 »

А как определить тип уже запущенного приложения (с параметрами его запустили или без).
У QtSingleApplication вроде есть sendMessage и сигнал messageReceived для общения между instances.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Октябрь 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
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Октябрь 28, 2013, 12:57 »

Цитировать
GetWindowText(hwnd,title,sizeof(title));

Переполнение буфера, и код возврата не проверяется. Если уж есть #ifdef UNICODE, то и TCHAR нужно вместо WCHAR.
« Последнее редактирование: Октябрь 28, 2013, 13:08 от Alex Custov » Записан
Serr500
Гость
« Ответ #8 : Октябрь 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;
« Последнее редактирование: Октябрь 28, 2013, 15:18 от Serr500 » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Октябрь 28, 2013, 15:05 »

Alex Custov , Serr500 , спасибо. Давно не работал с винапи и уже забыл, неудачный скопипастенный пример.

return !Result; - здесь нужно отрицание.
Записан
Serr500
Гость
« Ответ #10 : Октябрь 28, 2013, 15:19 »

return !Result; - здесь нужно отрицание.
Упс... Недосмотрел. Исправил.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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