Автозапуск приложения C ++ при загрузке Windows - PullRequest
2 голосов
/ 10 октября 2011

Я занимаюсь разработкой приложения на C ++ с опцией "автозапуск".Когда пользователь установил эту опцию, программа должна изменить что-то в Windows, чтобы Windows запускалась при следующей загрузке Windows и входе пользователя в систему.Кроме того, когда пользователь отключил эту опцию, программа должна вернуть все в исходное состояние.

Мне не нужно запускать приложение как службу, так что этого будет достаточно для запуска под учетной записью определенного пользователя после входа в систему.Итак, каков лучший способ заставить Windows запускать мое приложение.при следующей загрузке и входе пользователя?Я погуглил совет использовать папку автозагрузки.Это самый приятный и безопасный способ?

Если так, у меня есть 2 вопроса:

  1. Как определить папку автозагрузки.Я не доволен выводом SHGetSpecialFolderLocation () .Кажется, он возвращает мой каталог "HOME" при тестировании платформы WinXP (C: \ Documents and settings \% username%).
  2. Как создать там файл .lnk с использованием C ++?Я думаю, что копировать весь файл .exe было бы плохой идеей.

На самом деле моя программа кроссплатформенная, но опция "автозапуск" будет только для Windows.

Обновление

  1. Пробовал SHGetSpecialFolderLocation и получил хорошее значение в Windows7: "C: \ Users \ Pavel \ AppData \ Roaming \ Microsoft \ Windows \ Пуск \ Меню \ Программы \ Автозагрузка" УВЕДОМЛЕНИЕ: Если вы используете MinGW, вы должны определить _WIN32_IE для 0x0400, прежде чем включать ShlObj.h.

  2. Какое наилучшее решение (с точки зрения хорошего программирования) между использованием реестра (HKEY_CURRENT_USER \Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Run) и папка автозагрузки?

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Я бы предложил использовать ключи реестра, такие как HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run. Создайте строковое значение здесь с названием вашего программного обеспечения и значением вашего основного пути к исполняемому файлу - этого должно быть достаточно. Гораздо проще, чем создавать файл .lnk - и API редактирования реестра легко доступен из C ++

UPDATE:

Как подсказал @Ben, для вашей задачи лучше использовать HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run. Это автоматически запустит ваше приложение только для текущего пользователя, а мое первое предложение сделает это для всех пользователей.

UPDATE2:

Также обратите внимание, что какой бы метод вы ни выбрали для реализации автозапуска, у вас могут возникнуть проблемы с антивирусным программным обеспечением, поскольку большинство антивирусов с проактивной защитой внимательно следят за тем, чтобы программы автоматически запускались.

0 голосов
/ 10 октября 2011

Определите путь к папке автозагрузки с помощью SHGetSpecialFolderPath (см. Ответ Майкла Кохна).

Затем используйте IShellLink , чтобы создать ярлык в этой папке.

Редактировать: Я думаю, что использование ключа Run в реестре более надежно.

0 голосов
/ 10 октября 2011

Просто чтобы прояснить, элементы папки автозагрузки происходят во время входа в систему, а НЕ при загрузке.Это звучит как то, что вы хотите, я просто хочу уточнить термины.

Я думаю, вы действительно хотите SHGetSpecialFolderPath и константу CSIDL_STARTUP .Если я правильно читаю документы, это должно дать вам путь, который вы хотите.

...