2009-10-26 4 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 возвращает правильные ключи, но когда я вызываю RegEnumValue для первого ключа (то есть KeyName1), я получаю все 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()); 
Смежные вопросы