Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

  RegistryKey myKey = Registry.LocalMachine.OpenSubKey(
  @"SOFTWARE\\" + csStartKey, 
  false);
Registry.CurrentUser.CreateSubKey
        (myKey.ToString());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top