2009-10-26 64 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());