Автозапуск
В интернете нашёл следующее:
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?
Как исправить, чтобы значением был путь к исполняемому файлу??
Цитата:
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);
// Возвращаемое значение - длина пути в символах без терминатора.
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>. После внесения этих изменений все должно по идее заработать.
я понимаю что решения примитивно, но если нужно запускать именно программу, а не службу, то этого должно хватить.
Да и пользователю, если захочет убрать Ваш продукт из автозапуска, достаточно будет снести ярлык с папки, а не ковырять реестр.
Также этот подход избавит Вас от реализации добавления/удаления в реестр автозапуска (имею ввиду в интерфейсе программы).
Это не избавляет разработчика от необходимости реализации управления автозапуском через меню программы.
[QUOTE=rikki]Да и пользователю, если захочет убрать Ваш продукт из автозапуска, достаточно будет снести ярлык с папки, а не ковырять реестр.
[/QUOTE]
Я считаю, что пользователь не должен самостоятельно ни ярлыки удалять, ни в реестре ковыряться. И то и другое должен брать на себя инсталлятор/деинсталлятор.
Так что сказать, что из этих подходов проще - по-моему, одинаково. Но реестр все же более скрыт от рядового пользователя, чем "Автозагрузка".
Спасибо, sem2711! Всё, разобрался!