2009-10-26 53 views
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。

回答

3

通过所有的注册表函数看,我发现这一点:SHCopyKey或者我可以用这个:RegCopyTree为Vista和更高版本。

感谢您的帮助。

0

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

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