Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ Autorun
Автор: mishaga 15.2.2009, 5:44
Мне нужно, чтобы программа стартовала вместе с ОС...
Как я понимаю, нужно сделать примерно так:
#ifdef Q_OS_WIN
// тут код для Винды
#endif
#ifdef Q_OS_MAC
// тут код для Мака
#endif
#ifdef Q_OS_X11
// тут код для nix'ов
#endif
Если это единственный способ, то для Винды я ещё смогу написать через QSettings. Для Линуксов вряд ли. А вот для Маков ваще не в курсе как... Не сидел даже ни разу под Маком...
Поделитесь кодяном, у кого кокие догадки есть...
И если это не единственный способ, тогда скажите, какие ещё есть! =)
Автор: ViGOur 15.2.2009, 12:44
Цитата(mishaga @ 15.2.2009, 5:44)
Для Линуксов вряд ли.
Можно попробовать устанавливать демона, а он уже в свою очередь будет стартовать твое приложение.
С маком не работал, но так как он производная от FreeBsd, то думаю там тоже есть возможность создания и запуска демонов.
Автор: Litkevich Yuriy 15.2.2009, 13:37
Цитата(mishaga @ 15.2.2009, 8:44)
И если это не единственный способ, тогда скажите, какие ещё есть! =)
в комерческой версии доступен пакет Qt Solution, а в нем QServise (наследник QApplication), с помощью него на виндовозе можно сделать приложение-службу, а на *nix приложение-демон.
Автор: mishaga 16.2.2009, 7:13
Хех... Это круто, что есть такой пакет... Где б мне раздобыть теперь этот Qt Solution...
У кого есть, поделитесь, плиз!
Туплютуплю!
Скачал пакент, попытаюсь установить =)
Автор: Litkevich Yuriy 16.2.2009, 7:42
Цитата(mishaga @ 16.2.2009, 10:13)
Скачал пакент, попытаюсь установить =)
а его и устанавливать не надо, распаковывай и вперед:
Qt Solutions\utilites\qtservice\examples\
Автор: panter_dsd 16.2.2009, 19:50
А нах такие заморочки с демонами??? В винде делаешь так:
QSettings* setting=new QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::NativeFormat);
setting->setValue("APP_NAME",QDir::toNativeSeparators(QCoreApplication::applicationFilePath()));
setting->sync();
delete setting;
Вместо APP_NAME используешь имя своего приложения, вообще оно большого значения не имеет.
В Линухе можно глянуть в /home/user/.config/autostart или учесть разные DE.
В Маках, к сожалению, не секу, но тоже можно найти что попроще.
Автор: ViGOur 16.2.2009, 20:08
Цитата(panter_dsd @ 16.2.2009, 19:50)
В Линухе можно глянуть в /home/user/.config/autostart или учесть разные DE
В том-то и дело, что нет уверенности, что учтешь все и так как нужно!
Автор: panter_dsd 16.2.2009, 20:21
Использование демонов тоже не вариант:
1. Нет вероятности, что на всех Линухах будет работать.
2. Нужны права рута для установки демона.
Автор: edwardoid 17.2.2009, 0:28
ну извините, обыюно человеку у которого нет прав рута не доверят ставить проги под нормальный никс.
Автор: Константин 17.2.2009, 2:33
Цитата(edwardoid @ 17.2.2009, 0:28)
ну извините, обыюно человеку у которого нет прав рута не доверят ставить проги под нормальный никс.
интересно как он их(проги) будет ставить, если даже ему доверят? рута ему ведь всё-равно не дадут
на мой взгляд Пантер предложил лучший вариант. с оговоркой, что запускается гуёвая программа или вспомогательный процесс, необходимый непосредственно юзверю его запустившему. такой подход позволяет юзверю персонально управлять автостартом необходимых ему приложений, а не навязывать их юзверю свыше как венда.
если же требуется запуск системного процесса (демона), которым непривелигированный пользователь управлять не должен, выбор очевиден в пользу QtService (либо адекватного аналога).
Автор: mishaga 16.5.2009, 9:23
Всё круто, в Виндах кодян работает.
Но вот тут недавно забавная вещь приключилась - моя программа через QProcess
запускает другую программу (тоже мою, я сам её писал). Так вот, если главная программа
стартовала с ОС, то вторую программу она не можут запустить. А если главную программу
запускать ручками, то вторая запускается за милую душу.
Чё ж делать?
Если программа запускается со стартом ОС, мне нужно, чтобы она могла запустить другую.
Помогите, у кого какие идеи есть!..
Вот мой кодян:
// это конструстор
Tray::Tray()
{
WhereAmI = QCoreApplication::applicationDirPath(); // узнаём, в какой папке находится программа
// переменная WhereAmI объявлена в h-файле (тип - QString)
...
connect( &processBOB, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError)) );
// error - моя функция, описана ниже
...
execBOB( true ); // моя функция, описана ниже
}
// это функция execBOB();
void Tray::execBOB(bool args)
{
QString st = "";
if ( args ) st = "-r";
processBOB.start( WhereAmI + "/programs/Base_of_Birthdays" + getSuffix(), QStringList() << st );
// если args == true, передаём аргумент -r
// если false, передаём пустую строку параметров (т.е., не передаём параметры)
}
// это функция error(), которая вызывается, когда processBOB даёт сбои
void Tray::error(QProcess::ProcessError error)
{
QString ErrorText = "";
switch (error)
{
case QProcess::FailedToStart : ErrorText = "Failed to start"; break;
case QProcess::Crashed : ErrorText = "Crached"; break;
case QProcess::Timedout : ErrorText = "Timedout"; break;
case QProcess::WriteError : ErrorText = "Write error"; break;
case QProcess::ReadError : ErrorText = "Read error"; break;
default /* UnknownError */ : ErrorText = "Unknown error"; break;
}
trayIcon->showMessage("Error", ErrorText, QSystemTrayIcon::Critical, 3000);
}
Так вот, у меня, если программа стартует с ОС, появляется ошибка "Crached"
А если запускать ручками, всё работает отлично
Помогите! Это моя ВКР, её уже сдавать давно пора!.. =)
Автор: Litkevich Yuriy 16.5.2009, 12:12
Цитата(mishaga @ 16.5.2009, 13:23)
если программа стартует с ОС
а как ты её запускаешь? В реестре прописываешь?
Автор: Авварон 16.5.2009, 17:16
Цитата(mishaga @ 15.2.2009, 6:44)
А вот для Маков ваще не в курсе как... Не сидел даже ни разу под Маком...
в макоси за бут приложений на стартапе отвечает файл ./Library/Preferences/loginwindow.plist в домашней директории пользователя. Только хз, как его из программы изменить - в гугле что-то есть по этому поводу, но разбираться лень, да и не нужно (у меня нет ни 1й программы в авторане
)
Автор: mishaga 18.5.2009, 10:09
Цитата(Litkevich Yuriy @ 16.5.2009, 12:12)
а как ты её запускаешь? В реестре прописываешь?
Да, в реестре в ключе
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Автор: molchanoviv 18.5.2009, 19:51
Дык рабочий каталог если не ошибаюсь будет систем32.
Автор: mishaga 19.5.2009, 14:00
Цитата(molchanoviv @ 18.5.2009, 19:51)
Дык рабочий каталог если не ошибаюсь будет систем32.
Там нет значения, какой рабочий каталог,
ведь программа запускается командой
processBOB.start( WhereAmI + "/programs/Base_of_Birthdays" + getSuffix(), QStringList() << st );
А в WhereAmI - это полный путь к папке, в которой лежит моя программа.
Подпрограммы соответственно лежат в папке WhereAmI + "/programs/"
А функция getSuffix() вернёт ".exe", если программа запускается на Винде.
Вообще, у меня на компе всё работает.
Это на некоторых других компах (где тоже WinXP) программа, которая есть в автозагрузке,
не может через QProcess запустить другую программу. QProcess выдаёт слот с ошибкой Crached.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)