Запись значения DWORD в реестр на C++

Я пытаюсь программно записать значение DWORD в реестр на С++.

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

Это мой код:

HKEY hKey;
LPCWSTR sKeyPath;
int iResult;

sKeyPath = L"Software\\ABI\\";
iResult = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyPath, NULL, KEY_ALL_ACCESS, &hKey);
DWORD value = 0x00000003;
iResult = RegSetValueEx(hKey, L"Test", NULL, REG_DWORD, (const BYTE*)value, sizeof(value));
RegCloseKey(hKey);

Я выполнил базовую отладку и обнаружил, что значение iResult равно 998 после вызова RegSetValueEx. Я уверен, что этот ключ присутствует в реестре Windows, потому что я создал его вручную с помощью regedit.exe для целей тестирования. Значение DWORD «Test» изначально равно 0x00000009 и не меняется после запуска моей программы.

Я не уверен, где я ошибаюсь.

Любая помощь будет оценена по достоинству.

P.S. Мне не удалось найти в сети какой-либо полезный сайт по ошибке 998. Единственная ссылка, которую я нашел, упоминает, что это худшая ошибка, которую вы можете получить при работе с реестром.

П.П.С. Между прочим, я запускаю эту программу в Windows 8. Я не думаю, что это что-то меняет, но у меня уже был опыт работы с Windows 8 с некоторыми странными проблемами безопасности.


person l3utterfly    schedule 06.11.2012    source источник
comment
Вы можете проверить результат вашего RegOpenKeyEx, даже если вы знаете, что он есть. Тем не менее, я считаю, что у hmjd есть правильный ответ.   -  person WhozCraig    schedule 06.11.2012
comment
Если бы вы проверили, что означает 998, вы, вероятно, поняли бы это. net helpmsg 998 в командной строке дает вам Invalid access to memory location. - 0x00000003 не является допустимым адресом для чтения.   -  person Alex    schedule 06.11.2012
comment
Спасибо. Я не знал, что есть способ проверить ошибки в командной строке. Заставил меня кое-чему там научиться.   -  person l3utterfly    schedule 06.11.2012


Ответы (1)


Вам нужно передать адрес value:

iResult = RegSetValueEx(hKey,
                        L"Test",
                        NULL,
                        REG_DWORD,
                        (const BYTE*)&value, // Change made here.
                        sizeof(value));

Код ошибки 998 означает:

Неверный доступ к ячейке памяти.

Когда адрес value не передается, его фактическое значение (3) используется как адрес памяти, что приводит к сбою.

person hmjd    schedule 06.11.2012
comment
Спасибо. Я знал, что что-то упустил из виду... Я был очень расстроен. - person l3utterfly; 06.11.2012