Программное перемещение разделов реестра
Вопрос
Кто-нибудь знает, как я могу программно переместить реестр из 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());