3

我想删除一个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(无访问权限)。请帮我删除这个注册表项。

4

3 回答 3

5

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

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

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

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

使用L前缀时,通常还显式使用WAPI 函数的版本,以便函数的选择不会对UNICODE宏的状态敏感。

lReturn = RegDeleteValueW(hKey, L"value1");
于 2013-04-23T17:46:39.440 回答
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

于 2013-04-23T19:42:36.943 回答
1

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

(LPCWSTR)"test1\test2\test3"

使用 L"test1\test2\test3"

于 2013-04-23T17:46:50.040 回答