MFC写个删除注册表中HKEY_CURRENT_USER下某个子键路径和子键路径下面的所有项的函数 lResult = regKey.RecurseDeleteKey 返回2

MFC写个删除注册表中HKEY_CURRENT_USER下某个子键路径和子键路径下面的所有项的函数

在MFC(Microsoft Foundation Classes)中,你可以使用CRegKey类来编写一个函数,该函数删除HKEY_CURRENT_USER下的某个子键路径及其下的所有项。以下是一个简单的函数示例,展示了如何实现这个功能:

#include <afxwin.h>  // MFC core and standard components
#include <atlbase.h> // ATL base classes
#include <atlstr.h>  // CString class

// 删除HKEY_CURRENT_USER下的指定子键及其所有项
// 参数 subKeyPath 是相对于 HKEY_CURRENT_USER 的子键路径
// 返回 true 如果成功删除,否则返回 false
bool DeleteRegistryKeyAndSubkeys(const CString& subKeyPath)
{
    CRegKey regKey;
    LONG lResult;

    // 打开 HKEY_CURRENT_USER 下的指定子键
    lResult = regKey.Open(HKEY_CURRENT_USER, subKeyPath, KEY_WRITE | KEY_READ);
    if (lResult != ERROR_SUCCESS)
    {
        return false; // 打开键失败
    }

    // 删除子键及其所有项
    lResult = regKey.RecurseDeleteKey(subKeyPath);
    regKey.Close();

    return lResult == ERROR_SUCCESS;
}

这个函数首先尝试打开HKEY_CURRENT_USER下的指定子键。如果成功,它会调用RecurseDeleteKey方法来递归删除子键及其下的所有项。

注意

  • RecurseDeleteKey方法会删除指定的子键以及该子键下的所有子键和值。这是一个递归操作,因此应谨慎使用。
  • 在操作注册表时请格外小心,错误的操作可能导致系统出现问题。在进行此类操作之前,请确保备份相关的注册表键。

这个函数可以直接用于删除HKEY_CURRENT_USER下的任何指定子键及其包含的所有项。

发现不行,lResult = regKey.RecurseDeleteKey 返回2,但它是存在的。

在这里插入图片描述

MFC写个删除注册表中HKEY_CURRENT_USER下某个子键路径下面的所有项的函数 OK

在MFC中使用CRegKey类时,确实没有EnumValue这个成员函数。删除HKEY_CURRENT_USER下某个子键路径下的所有项需要采取不同的方法。以下是一个修改后的示例,使用RegEnumValue函数来枚举和删除子键下的所有项:

#include <afxwin.h>  // MFC core and standard components
#include <atlbase.h> // ATL base classes
#include <atlstr.h>  // CString class
#include <vector>

// 删除HKEY_CURRENT_USER下的指定子键下的所有项
bool DeleteAllItemsInRegistryKey(const CString& subKeyPath)
{
    CRegKey regKey;
    LONG lResult;

    // 打开 HKEY_CURRENT_USER 下的指定子键
    lResult = regKey.Open(HKEY_CURRENT_USER, subKeyPath, KEY_WRITE | KEY_READ);
    if (lResult != ERROR_SUCCESS)
    {
        return false; // 打开键失败
    }

    // 首先枚举所有值的名称
    DWORD dwIndex = 0;
    TCHAR szValueName[256];
    DWORD dwValueNameSize = 256;
    std::vector<CString> valueNames;

    while (RegEnumValue(regKey, dwIndex, szValueName, &dwValueNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
    {
        valueNames.push_back(szValueName);
        dwIndex++;
        dwValueNameSize = 256;
    }

    // 然后删除所有枚举到的项
    for (auto& valueName : valueNames)
    {
        regKey.DeleteValue(valueName);
    }

    regKey.Close();
    return true;
}

这个函数首先打开指定的子键,然后使用RegEnumValue函数来枚举子键下的所有项的名称,并将这些名称存储在一个向量中。之后,它遍历这个向量,删除每一个项。

注意

  • 这段代码仅删除子键下的值(values),不会删除子键下的其他子键(subkeys)。
  • 在操作注册表时,请格外小心,以避免可能对系统造成的不良影响。在进行修改之前,建议备份相关的注册表键。
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值