Автозапуск приложения C++ при загрузке Windows

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

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

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

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

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

Обновить

  1. Попробовал SHGetSpecialFolderLocation и получил хорошее значение в Windows7: "C:\Users\Pavel\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup" ПРИМЕЧАНИЕ. Если вы используете MinGW, вы должны определить _WIN32_IE на 0x0400, прежде чем включать ShlObj .час.

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


person pavelkolodin    schedule 09.10.2011    source источник
comment
Для всех пользователей или только для текущего пользователя?   -  person David Heffernan    schedule 10.10.2011


Ответы (3)


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

ОБНОВИТЬ:

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

ОБНОВЛЕНИЕ2:

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

person Sergey Kudriavtsev    schedule 09.10.2011
comment
Лучше: делайте это под HKEY_CURRENT_USER вместо HKLM. - person Ben Voigt; 10.10.2011
comment
@ben другое значение, конечно, но не лучше со всех точек зрения? - person David Heffernan; 10.10.2011
comment
@DavidHeffernan: В вопросе говорится, что это опция, которую может установить пользователь. - person Ben Voigt; 10.10.2011
comment
@Ben есть много людей, которые не знают о стандартных пользовательских ограничениях в Windows. - person David Heffernan; 10.10.2011
comment
@Ben: какое лучшее решение между использованием папки автозагрузки и реестра для моей цели? - person pavelkolodin; 10.10.2011
comment
@DavidHeffernan: Тем больше причин предлагать решения, которые работают с ограниченными привилегиями. - person Ben Voigt; 10.10.2011
comment
@ Бен, я просто хотел обратить внимание Павла на то, что здесь есть проблема, которую необходимо решить. - person David Heffernan; 10.10.2011
comment
@Pavel: Я согласен с Сергеем и Норбертом в том, что метод реестра проще как для вас, так и для пользователя. Папка автозагрузки больше для программ добавленных в автозапуск пользователем, реестр больше для автозапусков добавленных автоматически (хотя и с разрешения пользователя). И нет недостатка в инструментах, позволяющих пользователю видеть, какие программы перечислены в разделе реестра «Выполнить». - person Ben Voigt; 10.10.2011

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

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

person Michael Kohne    schedule 09.10.2011

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

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

Изменить: я думаю, что использование ключа «Выполнить» в реестре более надежно.

person Norbert Willhelm    schedule 10.10.2011