Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Автозапуск

23K
10 января 2012 года
1_2
34 / / 09.01.2012
Кто знает, как добавить приложение в автозапуск? У меня "Visual C++ 2008, экспресс-выпуск".
В интернете нашёл следующее:

HKEY hKey;
char szPath[0x100];
GetModuleFileName(NULL, (LPWCH)szPath, sizeof(szPath));
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
NULL,
L"",
REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE,
NULL,
&hKey,
NULL);

if (hKey)
{
RegSetValueEx(hKey, L"My program", NULL, REG_SZ, (LPBYTE)szPath, strlen(szPath));
RegCloseKey(hKey);
}

Но в реестре почему-то прописывается My program тип REG_SZ значение C
Почему GetModuleFileName возвращает значение C?
Как исправить, чтобы значением был путь к исполняемому файлу??
20K
10 января 2012 года
sem2711
124 / / 23.09.2009
Цитата:
sizeof(szPath));


Кто вас научил так определять размер массива? И вообще, используйте UNICODE. TCHAR вместо char со всеми вытекающими из этого последствиями. В той части кода, которую вы взяли из сети, так и сделано. Проще показать:

 
Код:
TCHAR szPath[MAX_PATH] = { 0 };
        // Возвращаемое значение - длина пути в символах без терминатора.
    DWORD pathLen = GetModuleFileName(hInst, szPath, MAX_PATH);
    size_t bufferSize;// Размер строки (буфера) в байтах.
    StringCbLength(szPath, MAX_PATH * sizeof(TCHAR), &bufferSize);
        // Добавляем к размеру буфера размер терминатора.
    bufferSize += sizeof(TCHAR);
    RegSetValueEx(hKey, L"My program", NULL, REG_SZ, (LPBYTE)szPath, bufferSize);
    RegCloseKey(hKey);

Для использования безопасных строковых функций подключите хэдер <strsafe.h>. После внесения этих изменений все должно по идее заработать.
41K
11 января 2012 года
rikki
46 / / 27.05.2010
быть может проще программно кинуть ярлык в папку автозапуск ?
я понимаю что решения примитивно, но если нужно запускать именно программу, а не службу, то этого должно хватить.
Да и пользователю, если захочет убрать Ваш продукт из автозапуска, достаточно будет снести ярлык с папки, а не ковырять реестр.
Также этот подход избавит Вас от реализации добавления/удаления в реестр автозапуска (имею ввиду в интерфейсе программы).
20K
11 января 2012 года
sem2711
124 / / 23.09.2009
[QUOTE=rikki]быть может проще программно кинуть ярлык в папку автозапуск ?[/QUOTE]
Это не избавляет разработчика от необходимости реализации управления автозапуском через меню программы.

[QUOTE=rikki]Да и пользователю, если захочет убрать Ваш продукт из автозапуска, достаточно будет снести ярлык с папки, а не ковырять реестр.
[/QUOTE]
Я считаю, что пользователь не должен самостоятельно ни ярлыки удалять, ни в реестре ковыряться. И то и другое должен брать на себя инсталлятор/деинсталлятор.

Так что сказать, что из этих подходов проще - по-моему, одинаково. Но реестр все же более скрыт от рядового пользователя, чем "Автозагрузка".
23K
11 января 2012 года
1_2
34 / / 09.01.2012
Спасибо, sem2711! Всё, разобрался!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог