Удаление ключа реестра C++
#include <iostream>
HKEY hKey;
RegOpenKey(HKEY_CURRENT_USER, L"\\Software\\RegistrySample", &hKey);
if (RegDeleteKey(hKey, L"Test string") != ERROR_SUCCESS)
FatalAppExitA(1, "При удалении ключа произошла ошибка");
RegCloseKey(hKey);
Но почему-то ключ не удаляется. Пишется созданное мной сообщение "При удалении ключа произошла ошибка". 1.В чём ошибка? 2. Как получить(заполнить) HKEY hKey?
Выводите сообщение об ошибке по коду. Там все будет написано. Почитайте мануал по функции и по FormatMessage.
Ошибка первая в том, что вы не проверяете успех/неуспех функции RegOpenKey(...) и не проверяете значение хэндла hKey, заполняемого ею. Если бы вы это сделали, то увидели бы, что hKey == NULL, соответственно, вызов функции RegDeleteKey заканчивается неудачей с кодом ошибки 6 (ERROR_INVALID_HANDLE). А причина всего этого в том, что в строковом параметре функции RegOpenKey нужно убрать первый бэкслэш (ну, то есть начинаться должно сразу с Software). Вот и все!
SHDeleteKey :trollface:
HKEY hKey;
if (RegOpenKey(HKEY_CURRENT_USER, L"Software\\RegistrySample", &hKey) != ERROR_SUCCESS)
FatalAppExitA(1, "При открытии ключа произошла ошибка");
if (RegDeleteKey(hKey, L"Test string") != ERROR_SUCCESS)
FatalAppExitA(1, "При удалении ключа произошла ошибка");
RegCloseKey(hKey);
По-моему ф-ия RegDeleteKey написана правильно... SHDeleteKey - выносит куст(не подходит). В чём же опять ошибка?
В RegDeleteKey() не указывайте имя параметра "Test string". Вместо этого укажите пустую строку. Да, и еще. Не используйте явно литеру L для указания на юникодную строку и не используйте явно анси- или юникод-варианты функций (если вы пишете, используя Win32 API). Лучше "оберните" все строки макросом TEXT() и используйте типы TCHAR, LPTSTR, LPCTSTR, а также функции без литер W или A в конце (кроме некоторых функций, которые существуют только в юникод-версии).
сюда еще раз.
Итак, для начала посмотрим
Цитата: sem2711
В RegDeleteKey() не указывайте имя параметра "Test string".
А у вас это параметр вообще или поддиректория? Может, я что-то не так понял? Если поддиректория, то ее имя указывать надо, но в поддиректории не должно содержаться никаких вложенных поддиректорий.
Test string - это параметр
Так вы определитесь,ключ это у вас или значение.Про FormatMessage выше уже писали 1.5 раза
Ключ - Это папка в реестре (подкаталог) как я понял.
Значение (value) - это конкретная строка в каталоге (запись). Автор пытается убрать строчку судя по второму аргументу: RegDeleteKey(hKey, L"Test string")
В его случае стоит применить: RegDeleteValue(hKey, L"Test string");
Про ошибки:
1. Создал сообщение в которое вывел номер ошибки.
2. Правой кнопкой на слове ERROR_SUCCESS, Go To Definition. Находим ответ.
Например в моем коде выдало ошибку №2, -> ERROR_FILE_NOT_FOUND, что значит "Файл не найден"