Программно переместить ключи реестра - PullRequest
2 голосов
/ 27 октября 2009

Кто-нибудь знает, как я могу программно переместить реестр из 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.

Ответы [ 2 ]

3 голосов
/ 27 октября 2009

Просматривая все функции реестра, я нашел это: SHCopyKey или я могу использовать это: RegCopyTree для Vista и более поздних версий.

Спасибо за помощь.

0 голосов
/ 27 октября 2009

Я не эксперт в этом, но попробуйте что-то вроде этого.

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