Отказано в доступе к реестру

Я впервые программно играю с реестром, и он не очень хорошо работает (но, по крайней мере, я не уничтожил свой компьютер). В частности, я продолжаю получать ошибку 5 (доступ запрещен) от RegCreateKeyEx и RegSetValueEx. Самое странное для меня то, что когда HKEY_CURRENT_USER\Software\dir1\Sub Directory уже существует, RegCreateKeyEx завершается с ошибкой 5, но когда он еще не существует, он успешно создает его; а затем терпит неудачу в RegSetValueEx.

Я делаю что-то не так в этом коде?

BOOL MyDialog::SaveLocationsToRegistry()
{
    HKEY   hkey;
    DWORD  dwDisposition;
    DWORD dwType, dwSize;
    LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\dir1\\Sub Directory"), 
                                 0, NULL, 0, 0, NULL, &hkey, &dwDisposition);
    if(result == ERROR_SUCCESS)
    {
        LPCTSTR szLastFolder = "C:\\Documents and Settings\\user\\My Documents\\Copy of item\0";
        dwType = REG_SZ;
        dwSize = strlen(szLastFolder)+1;
        LONG setResult = RegSetValueEx(hkey, TEXT("LastFolder"), 0, dwType, 
        (PBYTE)&szLastFolder, dwSize);
        RegCloseKey(hkey);
        return setResult == ERROR_SUCCESS;
    }
    else
    {
        return false;
    }
}

Примечание. Абсолютный путь присутствует только временно. Шаги малыша ;-)


person Smashery    schedule 03.11.2009    source источник
comment
Вы работаете от имени администратора? или с каким-то ограниченным доступом?   -  person Naveen    schedule 03.11.2009


Ответы (1)


Вы не запрашиваете никаких прав доступа. Вы, вероятно, хотите указать KEY_WRITE (или что-то еще) для 6-го параметра (samDesired).

LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\dir1\\Sub Directory"),
                 0, NULL, 0, KEY_WRITE, NULL, &hkey, &dwDisposition);
person Michael Burr    schedule 03.11.2009
comment
Тарабарщина оказалась неверным уровнем косвенности или чем-то в этом роде. В очередной раз благодарим за помощь! - person Smashery; 03.11.2009
comment
KEY_WRITE включает несколько прав доступа. Если какой-либо из них не предоставлен вызывающему пользователю, RegCreateKeyEx() завершится ошибкой. Поскольку код просто хочет вызвать RegSetValueEx(), я бы вместо этого указал KEY_SET_VALUE сам по себе. - person Remy Lebeau; 10.08.2012