2013-04-23 116 views
2

我想删除一个注册表密钥,但是在此代码中,我始终得到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。

回答

4

将字符串文字类型转换为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"); 
1

只是铸造一个字符串转换为宽字符串是不正确的

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

使用L “测试1 \ TEST2 \ TEST3”

2

您正在滥用类型转换,并且您将错误的参数值传递给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密钥。