2

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

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

例如,如果键是 HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\KeyName1 并且它下面有 3 个值,而我有 HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\KeyName2 并且它有 2 个值。看起来 RegEnumKeyEx 正在返回正确的键,但是当我为第一个键(即 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。

4

2 回答 2

3

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

谢谢您的帮助。

于 2009-10-26T22:06:26.163 回答
0

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

  RegistryKey myKey = Registry.LocalMachine.OpenSubKey(
  @"SOFTWARE\\" + csStartKey, 
  false);
Registry.CurrentUser.CreateSubKey
        (myKey.ToString());
于 2009-10-26T21:40:43.613 回答