从Registy中删除密钥

OhF*_*una 2 c++ regex registry winapi

我想删除一个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);
Run Code Online (Sandbox Code Playgroud)

如果我将RegDeleteKey参数更改为:

lReturn = RegDeleteKey(HKEY_LOCAL_MACHINE,(LPCWSTR)"test1\\test2\\test3");
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*edy 5

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

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

lReturn = RegDeleteValue(hKey, L"value1");
lReturn = RegDeleteValue(hKey, _T("value1"));
Run Code Online (Sandbox Code Playgroud)

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

使用L前缀时,通常也会明确使用WAPI函数的版本,以便选择函数对UNICODE宏的状态不敏感.

lReturn = RegDeleteValueW(hKey, L"value1");
Run Code Online (Sandbox Code Playgroud)