Не могу добавить свое приложение в автозапуск

Пишу небольшое приложение на чистом C++. Но теперь я поощряю странную проблему. Я хотел добавить свое приложение в автозапуск, но оно не работает. Я использую этот код для доступа к реестру:

BOOL SetKeyData(HKEY hRootKey, WCHAR *subKey, DWORD dwType, WCHAR *value, LPBYTE data, DWORD cbData)
{
    HKEY hKey;
    if(RegCreateKeyW(hRootKey, subKey, &hKey) != ERROR_SUCCESS)
        return FALSE;

    LSTATUS status = RegSetValueExW(hKey, value, 0, dwType, data, cbData);
    if(status != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        return FALSE;
    }

    RegCloseKey(hKey);
    return TRUE;
}

Сначала я подумал, что проблема в данных, которые я обслуживаю, поэтому я преобразовал WCHAR с путем в LPBYTE следующим образом и выполнил эту функцию следующим образом:

size_t i;
char *pMBBuffer = (char *)malloc( MAX_PATH );
wcstombs_s(&i, pMBBuffer, MAX_PATH, my_program, MAX_PATH-1 );
SetKeyData(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", REG_SZ, L"zwApplication", (LPBYTE)pMBBuffer, i))

Я получаю код состояния ERROR_ACCESS_DENIED. Возможно, проблема в политике Windows 7, но я думал, что у меня есть полный доступ ко всему в HKEY_LOCAL_MACHINE. Как решить эту проблему?


person zwierzak    schedule 20.05.2012    source источник
comment
Такое действие, как это, определенно потребует повышенных разрешений, запускаемых от имени администратора ??   -  person GHz    schedule 20.05.2012
comment
Дает ли он вам тот же код состояния для HKEY_CURRENT_USER?   -  person J A    schedule 20.05.2012


Ответы (1)


Для записи в HKEY_LOCAL_MACHINE требуется, чтобы ваше приложение работало с повышенными привилегиями. Это означает, что вашему приложению потребуется указать это в своем файле манифеста.

Без этого вы можете только писать в HKEY_CURRENT_USER или читать из HKEY_LOCAL_MACHINE, но для вашего требования автозапуска это будет работать так же хорошо.

person Stefan    schedule 20.05.2012
comment
Спасибо, это решило мою проблему, теперь у меня есть следующая. У меня есть путь к моей программе в WCHAR и как преобразовать его в LPBYTE? Я думал, что могу использовать wcstombs_s, но когда я записываю его в реестр, он не читается. - person zwierzak; 20.05.2012
comment
вам не нужно преобразовывать строку: если вы передаете REG_SZ, lpByte должен указывать на (широкую) строку char. Не нужно ничего конвертировать. (широкая строка символов, если вы компилируете с помощью UNICODE, простая строка символов в случае ANSI) - person Stefan; 20.05.2012