Почему не работает функция добавления в автозагрузку Windows?

#c #windows #g #registry

#c #Windows #g #реестр

Вопрос:

В диспетчере задач автозапуск отключен. Где ошибка в этой функции?

 void AutoRun()
{
    char arr[MAX_PATH] = { };
    GetModuleFileName(NULL, (LPWSTR)arr, MAX_PATH);
    
    HKEY hKey;

    if (RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL, amp;hKey, NULL) == ERROR_SUCCESS)
    {
        if (RegSetValueEx(hKey, L"svchost", NULL, REG_SZ, (LPBYTE)arr, (sizeof(arr)   1)) == ERROR_SUCCESS)
        {
            RegCloseKey(hKey);
        }
        return;
    }
}
 

Диспетчер задач:

1

Ответ №1:

Вы явно компилируете для Unicode, но используете char[] массив вместо wchar_t[] массива. Вам нужно использовать последнее.

Вы также передаете неправильное значение длины RegSetValueEx() . Вам нужно указать длину строки в байтах только до нулевого разделителя и включительно. Не длина байта всего массива в целом (на самом деле, вы указываете даже больше).

Кроме того, вы пропускаете HKEY RegSetValueEx() сбой if.

Попробуйте это вместо:

 void AutoRun()
{
    wchar_t arr[MAX_PATH] = { };
    GetModuleFileName(NULL, arr, MAX_PATH);
    
    HKEY hKey;

    if (RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Run", 0, NULL, 0, KEY_SET_VALUE, NULL, amp;hKey, NULL) == ERROR_SUCCESS)
    {
        RegSetValueEx(hKey, L"svchost", NULL, REG_SZ, (LPBYTE)arr, (lstrlen(arr) 1) * sizeof(wchar_t));
        RegCloseKey(hKey);
    }
}