从注册表中删除键

3

我想删除一个注册表键,但是在这段代码中,我总是得到返回值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(无访问权限)。请帮我删除这个注册表项。
3个回答

5
将字符串字面值强制转换为LPCWSTR不会将其转换为该类型。它只是告诉编译器,尽管字面值的真实类型不同,你知道得更好,应该将其视为另一种类型。编译器不会检查你是否说了实话,在这种情况下,你是错误的。
如果你想要一个宽字符字符串字面值,请使用L前缀,或者像第一条语句中使用的那样,使用_T宏。
lReturn = RegDeleteValue(hKey, L"value1");
lReturn = RegDeleteValue(hKey, _T("value1"));

操作系统返回2是正确的,因为指向的值无法直接找到。通过LPCWSTR类型转换,该函数期望指针指向一个由两个字节构成的字符序列。但是,你给它一个由一个字节构成的字符序列。它读取前两个字节并将其视为单个字符。它将“va”或“te”读取为一个单独的字符,并发现没有以这样的字符开头的名称为值或键,从而失败。
当使用L前缀时,通常也要明确使用API函数的W版本,以便函数的选择不会受到UNICODE宏状态的影响。
lReturn = RegDeleteValueW(hKey, L"value1");

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键,那么没必要打开该键并逐个删除其值。删除一个键会自动删除该键的所有值。只有当存在子键时才需要删除子键,例如在删除test2键之前删除test3键。


1

仅仅将一个字符串转换为宽字符字符串是不正确的

(LPCWSTR)"test1\test2\test3"

应该使用 L"test1\test2\test3"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接