从注册表中删除密钥

时间:2013-04-23 17:41:09

标签: c++ regex winapi registry

我想删除一个Registrykey,但是在这段代码中,我总是得到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");

我得到了Returnvalue 5(无法访问)。请帮我删除这个注册表项。

3 个答案:

答案 0 :(得分:5)

将字符串文字类型转换为LPCWSTR不会将其转换为该类型。它只是告诉编译器,尽管文字的真实类型,你知道的更好,它应该被视为另一种类型。编译器不检查你是否说实话,在这种情况下,你错了。

如果您需要宽字符字符串文字,请使用L前缀,或者像在第一个语句中那样使用_T宏:

lReturn = RegDeleteValue(hKey, L"value1");
lReturn = RegDeleteValue(hKey, _T("value1"));

操作系统返回2是正确的,因为您指向的值确实无法按原样找到。对于LPCWSTR的类型转换,该函数期望指针指向一个双字节字符序列。但是,你给了它一个单字节字符的序列。它读取第一对字节并将其视为单个字符。它将'va''te'读取为单个字符,找不到名称以此类字符开头的值或键,并失败。

使用L前缀时,通常也会明确使用API​​函数的W版本,以便选择函数对{{1}的状态不敏感}宏。

UNICODE

答案 1 :(得分:3)

您滥用了类型转换,无论如何您将错误的参数值传递给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密钥,则无需打开该密钥并从中删除单个值。删除密钥会自动删除所有密钥的值。您只需删除子密钥(如果存在),例如删除test3密钥,然后才能删除test2密钥。

答案 2 :(得分:1)

只是将字符串转换为宽字符串是不正确的

(LPCWSTR) “测试1 \ TEST2 \ TEST3”

使用L“test1 \ test2 \ test3”

相关问题