Я написал программу на C #, которая сначала читает, а затем записывает значение из / в HKLM \ Software \ MyApp. Это приложение x86 без манифеста, и я работаю как не администратор в Windows 7, x86, поэтому я ожидаю, что оно будет фактически считывать и записывать в соответствующее расположение виртуального реестра (HKCU \ Software \ Classes \ VirtualStore \ Machine \ Software \ MyApp.)
Перед запуском приложения я вручную поместил через regedit одно значение в виртуализированном расположении и другое значение в расположении HKLM.
При первом запуске приложения оно читает значение HKLM и не видит виртуализированное значение. Однако, когда он пишет, он пишет в виртуализированное местоположение.
Однако при последующих запусках (после первой записи в виртуализированное местоположение) приложение считывает виртуализированное значение, а не значение в HKLM.
Я пытаюсь выяснить, какие изменения между первым и последующим запусками могут привести к расхождению в том, откуда он читает. Это не виртуальные флаги в HKLM \ Software \ MyApp - все они очищены как до, так и после первого запуска.
Я повторил это для нескольких разных учетных записей. (И, FWIW, я также видел, что QuickTime ведет себя так же, и именно поэтому я играю с этим.) Стоит отметить, что первый запуск каждого пользователя имеет одинаковое поведение, независимо от того, является ли другой пользователь уже запустил приложение на той же машине.
Вот мой код:
static void Main(string[] args)
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\MyApp");
if (key != null)
{
String value = (string)key.GetValue("name");
Console.WriteLine("read value " + value);
key.Close();
}
else Console.WriteLine("open key for read failed");
key = Registry.LocalMachine.OpenSubKey("Software\\MyApp", true);
if (key != null)
{
key.SetValue("name", "programValue");
Console.WriteLine("Wrote value programValue");
}
else
Console.WriteLine("open key for write failed");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Перед первым запуском в реестре находятся следующие значения:
HKLM \ Software \ MyApp: name = "handHKLMValue"
HKCU \ Software \ Classes \ VirtualStore \ Machine \ Software \ MyApp: name = "handVirtualValue"
Выход первого запуска:
прочитанное значение handHKLMValue
Написал значение программы Value
Просматривая реестр, я вижу, что programValue действительно была записана в виртуализированную папку, перезаписывая handVirtualValue. Т.е. реестр теперь содержит следующие значения:
HKLM \ Software \ MyApp: name = "handHKLMValue"
HKCU \ Software \ Classes \ VirtualStore \ Machine \ Software \ MyApp: name = "programValue"
И, конечно же, последующие запуски имеют вывод:
читать значение programValue
Написал значение программы Value
Что могло измениться между первым и последующим запусками, и что мне нужно сделать (если не считать прямой просмотр в виртуализированном местоположении), чтобы он прочитал handVirtualValue при первом запуске?