Поэтому я написал себе удобное приложение, которое всегда хочу запускать.
Он написан на C ++ с QT.
Автозапуск осуществляется через реестр
Если пользователь нажимает флажок автозапуска, этот код выполняется
QSettings RegSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::NativeFormat);
if (ui.cb_autorun->isChecked())
{
RegSettings.setValue("FanControlV2", "\"" + QDir::currentPath().remove("/platforms").replace("/", "\\") + "\\FanControllerV2.exe\"");
}
else {
RegSettings.remove("FanControlV2");
}
Это работает нормально, по крайней мере, большую часть времени
Но иногда приложение просто не запускается, и мне приходится запускать его вручную
Я действительно не знаю, что я делаю здесь неправильно, так как многие другие приложения запускаются просто отлично каждый раз …
Любой совет?
Изменить: проблема возникает на win7, 8.1 и 10
Использование currentPath
определить местоположение исполняемого файла вашего приложения всегда ошибка. Вы никогда не должны делать это. В большинстве операционных систем вы не имеете никакого контроля над тем, каков рабочий каталог вашего приложения. Это может быть буквально что угодно. Более того, за пределами OS X пользователи могут, скорее всего, поощрять установку рабочей папки для своего приложения по своему вкусу, чтобы в диалоговых окнах доступа к файлам указывалось на полезное расположение по умолчанию.
Скорее всего, это происходит успешно, когда рабочий каталог вашего процесса совпадает с папкой установки, когда настройки хранятся в реестре. Но это состояние просто счастливое совпадение, как вы сами определили экспериментально.
Вы должны использовать QCoreApplication::applicationFilePath()
чтобы получить правильный путь. Вы также должны использовать QDir::toNativeSeparators
вместо раскатанной вручную замены.
Ваш код должен выглядеть следующим образом:
RegSettings.setValue("FanControlV2", QDir::toNativeSeparators(
QCoreApplication::applicationFilePath()));