从注册表中删除密钥
问题描述:
我想删除一个注册表密钥,但是在此代码中,我始终得到Returnvalue 2(找不到文件),但路径等于参数。从注册表中删除密钥
HKEY hKey;
long lReturn = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("test1\\test2\\test3"),
0L,
KEY_ALL_ACCESS,
&hKey);
lReturn = RegDeleteValue(hKey,(LPCWSTR)"value1");
lReturn = RegDeleteValue(hKey,(LPCWSTR)"value2");
lReturn = RegDeleteKey(hKey,(LPCWSTR)"test1\\test2\\test3");
lReturn = RegDeleteKey(hKey,(LPCWSTR)"test1\\test2");
lReturn = RegCloseKey(hKey);
,如果我RegDeleteKey参数更改为:
lReturn = RegDeleteKey(HKEY_LOCAL_MACHINE,(LPCWSTR)"test1\\test2\\test3");
我得到的返回值5(没有权限)。请帮我删除这个Registryentry。
答
将字符串文字类型转换为LPCWSTR不会将其转换为该类型。它只是告诉编译器,尽管文字的真实类型,你知道更好,它应该被视为另一种类型。编译器不检查你是否在说真话,在这种情况下,你错了。
如果你想有一个宽字符字符串文字,使用L
前缀,否则使用_T
宏就像你在第一个声明没有:
lReturn = RegDeleteValue(hKey, L"value1");
lReturn = RegDeleteValue(hKey, _T("value1"));
操作系统是正确返回2,因为值你指着真的不可能被发现。通过类型转换为LPCWSTR,该函数期望指针指向一个双字节字符序列。不过,你给了它一个单字节字符序列。它读取第一对字节并将其视为单个字符。它读取'va'
或'te'
作为单个字符,找不到名称以此类字符开头的值或键,并且失败。
当使用前缀L
时,通常也明确使用API函数的版本,以便选择函数不会对UNICODE
宏的状态敏感。
lReturn = RegDeleteValueW(hKey, L"value1");
答
只是铸造一个字符串转换为宽字符串是不正确的
(LPCWSTR) “测试1 \ TEST2 \ TEST3”
使用L “测试1 \ TEST2 \ TEST3”
答
您正在滥用类型转换,并且您将错误的参数值传递给RegDeleteKey()
。试试这个:
HKEY hKey = NULL;
long lReturn = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("test1\\test2\\test3"),
0L,
KEY_SET_VALUE,
&hKey);
if (lReturn == ERROR_SUCCESS)
{
lReturn = RegDeleteValue(hKey, _T("value1"));
lReturn = RegDeleteValue(hKey, _T("value2"));
lReturn = RegCloseKey(hKey);
}
lReturn = RegDeleteKey(HKEY_CURRENT_USER, _T("test1\\test2\\test3"));
lReturn = RegDeleteKey(HKEY_CURRENT_USER, _T("test1\\test2"));
顺便说一句,如果你要删除test3
关键反正那么就没有必要打开键和删除单个值从它。删除密钥会自动删除您的所有密钥值。您只需删除子项(如果有的话),如在删除test2
密钥之前删除test3
密钥。