以编程方式移动注册表项

时间:2009-10-26 21:07:22

标签: c++ registry enumerate

有谁知道如何以编程方式将注册表从HKEY_LOCAL_MCAHINE移至HKEY_CURRENT_USER?

我编写了一个使用RegEnumKeyEx和RegEnumValue的递归函数,但似乎RegEnumValue返回顶级键下的所有值。

例如,如果密钥是HKEY_LOCAL_MACHINE \ SOFTWARE \ MyApp \ KeyName1并且其下有3个值,并且我有HKEY_LOCAL_MACHINE \ SOFTWARE \ MyApp \ KeyName2并且有2个值。看起来RegEnumKeyEx正在返回正确的密钥,但是当我为第一个Key(即KeyName1)调用RegEnumValue时,我得到所有5个值,而不仅仅是该密钥下的3个。

希望一切都有道理......我做错了什么?

感谢您的帮助

这是一个片段,如果它有帮助:

void CArgusApp::RecurseSubKeys(CString csStartKey)
{
    CQERegistry reg;

    HRESULT hr = reg.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\" + csStartKey, KEY_QUERY_VALUE );

    CStringArray csaDataNames;
    reg.GetAllDataNames(csaDataNames);
    for (int j = 0; j < csaDataNames.GetSize(); j++)
    {
        CString csValueName = csaDataNames.ElementAt(j);
        TRACE(csStartKey + " - " + csValueName);
    }

    CStringArray csaKeys;
    reg.GetAllSubKeys(csaKeys);
    for (int i = 0; i < csaKeys.GetSize(); i++)
    {
        CString csKey = csaKeys.ElementAt(i);
        this->RecurseSubKeys(csStartKey + "\\" + csKey);
    }

    reg.Close();
}

即。上面的GetAllDataNames只调用RegEnumValue和GetAllSubKeys调用RegEnumKeyEx。

2 个答案:

答案 0 :(得分:3)

查看所有注册表函数,我发现:SHCopyKey或者我可以使用它:Vista及更高版本的RegCopyTree。

感谢您的帮助。

答案 1 :(得分:0)

我不是这方面的专家,但尝试这样的事情。

  RegistryKey myKey = Registry.LocalMachine.OpenSubKey(
  @"SOFTWARE\\" + csStartKey, 
  false);
Registry.CurrentUser.CreateSubKey
        (myKey.ToString());