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

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

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: SingleApplication (qt4.4)  (Прочитано 57743 раз)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #30 : Июнь 23, 2008, 21:29 »

никто так и не сказал нормально ли собирается под студией

Шаред собираеться и работает нормально. А как собрать статик (что-то я ненашел где это выставить)?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #31 : Июнь 23, 2008, 21:37 »

Попробуй так:

Код:
LocalThread::LocalThread(quintptr socketDescriptor, const QString& name, QObject* parent) : QThread(parent)
{
this->socketDescriptor = socketDescriptor;
this->name = name;
}

LocalThread::~LocalThread()
{
    if (!isRunning())
        return;

    stop();
    wait();
}

void LocalThread::stop()
{
QMutexLocker locker( &m_stopMutex );
m_stopped = true;
}

void LocalThread::run()
{
m_stopMutex.lock();
m_stopped = false;
m_stopMutex.unlock();

QLocalSocket socket;
if(!socket.setSocketDescriptor(socketDescriptor) || socket.state() != QLocalSocket::ConnectedState)
return;

// send app_id to client
if(!writeMessage(&socket, name))
return;

// wait to messages from client
while(socket.state() == QLocalSocket::ConnectedState && !m_stopped)
{
if(socket.waitForReadyRead(1000))
{
// ...
}
}
}
« Последнее редактирование: Июнь 23, 2008, 21:40 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #32 : Июнь 23, 2008, 22:58 »

никто так и не сказал нормально ли собирается под студией

Шаред собираеться и работает нормально. А как собрать статик (что-то я ненашел где это выставить)?

в config.pri:
Цитировать
# Chose one of the following two lines to configure the build
#SINGLEAPPLICATION_LIBCONFIG = dll
SINGLEAPPLICATION_LIBCONFIG = staticlib
должно собирать статическую версию...нет?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #33 : Июнь 23, 2008, 23:02 »

должно собирать статическую версию...нет?

Сорри, просмотрел. Каюсь Подмигивающий
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #34 : Июнь 25, 2008, 06:05 »

проглядел...статик действительно не собирало Улыбающийся
обновил до 0.3.1 (в 0.3 появился пример "лоадер")
Записан
ритт
Гость
« Ответ #35 : Июнь 27, 2008, 06:58 »

у меня сегодня появилось нехорошее "подозрение"...и оно, мля, оправдалось Грустный
а именно: "с каких пор нэймэд пайпз видимы только для породившего их пользователя?!" - та же ошибка, что и у димин'ского дсинглаппликейшен!
как бы некритично - свою задачу СА и так выполняет...но не совсем отвечает заявленному функционалу Улыбающийся

полагаю, самым простым решением было бы добавлять ид текущего юзверя к ключу соединения? или же нативные мутексы пользовать (кстати, кто знает как там с областью видимости?)?
соответственно, вопрос к гуру натив_апи: как узнать ид юзверя, запустившего наше приложение?
Записан
Tonal
Гость
« Ответ #36 : Июнь 27, 2008, 07:56 »

Для винды, думаю будет интересна следующая статейка: http://msdn.microsoft.com/en-us/library/aa382954(VS.85).aspx
Записан
Sergeich
Гость
« Ответ #37 : Июнь 27, 2008, 23:48 »

2 Константин: Повторяю вопрос: хочу пользовать сие в коммерческом приложении с закрытыми исходниками, можно?
Записан
ритт
Гость
« Ответ #38 : Июнь 28, 2008, 00:59 »

Тонал, из статейки вынес, что подобный КО должен создаваться в нэймспейсе юзверя (если я правильно понял)
провожу простой эксперимент: запускаю тривиал под админом (хрень про сп2), логинюсь под другим админом и запускаю тривиал опять - тишина, возвращаюсь в первую учётку - вуаля - мессаги от других экземпляров
похоже, я чего-то недопонимаю(?)
на винапи довольно давно не писал ничего _вообще_. откопал старый код получения юзверь-инфы под нтями...мсдн говорит, что под 9х этот код даже не запустится.
наставьте на путь истинный? Улыбающийся

Сергеич, можно - не вопрос!
кинте в меня линкой на лжпл...а то лень заела Улыбающийся
Записан
Sergeich
Гость
« Ответ #39 : Июнь 28, 2008, 12:31 »

Сергеич, можно - не вопрос!
кинте в меня линкой на лжпл...а то лень заела Улыбающийся
Ну дык собственно вот.
Записан
Sergeich
Гость
« Ответ #40 : Июнь 28, 2008, 14:11 »

Посмотрел пример loader. Обнаружил что:
1) При первом запуске параметры командной строки не обрабатываются
2) При повторных запусках окно не активируется
Поправил main.cpp:
Код:
#include <QtCore/QObject>
#include <QtCore/QString>
#include <QtGui/QApplication>

#include "mainwindow.h"
#include "singleapplication.h"

#ifdef Q_WS_WIN
#include <QtCore/QLibrary>
typedef int (*ASFW_Func) (qint32);
#endif

int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QStringList args = app.arguments();
args.removeFirst();
QString message = args.join(" ");

#ifdef Q_WS_WIN
ASFW_Func AllowSetForegroundWindow = (ASFW_Func) QLibrary::resolve("user32", "AllowSetForegroundWindow");
if (AllowSetForegroundWindow)
AllowSetForegroundWindow(-1);
#endif

SingleApplication instance("LoaderExample");
if(instance.isRunning())
{
if(instance.sendMessage(message))
return 0;
}

MainWindow mw;
mw.handleMessage(message);
mw.show();

QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
&mw, SLOT(handleMessage(const QString&)));

return app.exec();
}
Записан
ритт
Гость
« Ответ #41 : Июнь 28, 2008, 15:17 »

у меня на строке AllowSetForegroundWindow(-1) сегфоултит с сообщением: 0x6e12f932 in ZN7QString17fromLatin1_helperEPKci () from QtCore4.dll

обработку параметров исправил
перелицензировал под лжпл2
Записан
Sergeich
Гость
« Ответ #42 : Июнь 28, 2008, 17:41 »

у меня на строке AllowSetForegroundWindow(-1) сегфоултит с сообщением: 0x6e12f932 in ZN7QString17fromLatin1_helperEPKci () from QtCore4.dll
А че за компилятор и операционка? Попробуй поставить
typedef int (*ASFW_Func) (unsigned long);
Записан
ритт
Гость
« Ответ #43 : Июнь 28, 2008, 18:02 »

win32xp pro sp2, gcc3.4.5
по идее DWORD == qint32
/* при ансигнед получу ворнинг для -1 */
почитал на мсдн о асфв...как я понял, константа ASFW_ANY и есть -1 ?

сигсерв получаю в любой следующей за AllowSetForegroundWindow(-1) строке кода
пробовал вместо -1 подставлять ид процесса, 0 и просто наобум ( Улыбающийся ) - результат один и тот же
был бы признателен, если бы кто-то ещё попробовал пример с AllowSetForegroundWindow под мингвом
Записан
Sergeich
Гость
« Ответ #44 : Июнь 28, 2008, 18:21 »

Мда... лучше так:
Код:
#ifdef Q_WS_WIN
#include <QtCore/QLibrary>
#include <windows.h>

typedef BOOL (*ASFW_Func) (DWORD);
#endif
А QLibrary::resolve чего возвращает? Может оно уже определено? И лучше написать:
Код:
#ifdef Q_WS_WIN
ASFW_Func asfw = (ASFW_Func) QLibrary::resolve("user32", "AllowSetForegroundWindow");
if (asfw)
asfw(-1);
#endif
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


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