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)。
- 在操作注册表时,请格外小心,以避免可能对系统造成的不良影响。在进行修改之前,建议备份相关的注册表键。