2016-06-15 3 views
-3

Я попытался добавить значение в реестр в C++. Программа запускается и не имеет ошибок. I Значение не создается (RegSetValueEx). Код:C++ RegSetValueEx - Regedit

HKEY hkey; 
long regOpenResult; 
const char path[] = "C:\\test"; 

regOpenResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, 
    KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey); 

LPCSTR stuff = "test"; 
RegSetValueEx(hkey, stuff, 0, REG_SZ, (BYTE*)path, strlen(path)); 

Спасибо Вам за помощь! :)

+0

Вы проверили с помощью 'GetLastError()'? Видел правильный реестр? – Ajay

+0

Может быть проблемой с разрешениями. Вы запрашиваете KEY_ALL_ACCESS (самый высокий уровень доступа) на уровне машинного уровня. –

+0

HKEY hkey; \t long regOpenResult; \t const char path [] = "C: \\ test"; \t regOpenResult = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE \\ Microsoft \\ Windows, \\ CurrentVersion \\ Run", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey); \t LPCSTR материал = "тест"; \t RegSetValueEx (HKEY, материал, 0, REG_SZ, (BYTE *) path, strlen (path)) \t GetLastError(); 0 error: c – S0rkBlank

ответ

1

Вы не проверяете значения возврата для ошибок. С очень высокой вероятностью звонок RegOpenKeyEx возвращает ERROR_ACCESS_DENIED. Это связано с тем, что у стандартного пользователя нет прав на изменение HKLM.

Если вам нужно изменить HKLM, вам необходимо выполнить этот код в процессе повышенной работы. Добавьте опцию runAsAdministrator к вашему манифесту или используйте пункт меню Запуск от admin, чтобы начать его.

Но самое первое, что нужно сделать, это добавить проверку ошибок, чтобы вы могли диагностировать сбои, а не быть полностью в темноте.

Вы должны также передать strlen(...) + 1, когда вы позвоните RegSetValueEx, чтобы вы записывали нулевой ограничитель в реестр.

2

Вы не проверяете ошибки, и в любом случае вы не используете правильные разрешения. KEY_ALL_ACCESS ограничивается только администраторами (как, в первую очередь, пишет HKLM). Используйте KEY_SET_VALUE вместо этого:

HKEY hkey; 
LONG regResult; 
const char path[] = "C:\\test"; 

regResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, 
    KEY_SET_VALUE | KEY_WOW64_64KEY, &hkey); 
if (regResult != ERROR_SUCCESS) 
{ 
    // error opening the key, do something... 
} 
else 
{ 
    regResult = RegSetValueEx(hkey, "test", 0, REG_SZ, (BYTE*)path, strlen(path)+1); 
    if (regResult != ERROR_SUCCESS) 
    { 
     // error writing to the key, do something... 
    } 
    RegCloseKey(hkey); 
} 

И убедитесь, что ваш код руководит пользователем администратору (в поднятом процессе, если UAC включен). Стандартные пользователи не могут писать в HKLM, если администратор не применяет политику безопасности, чтобы предоставить доступ к стандартным пользователям.

Смежные вопросы