Почему приложение Windows 7 не видит значение виртуализированного реестра при первом запуске? - PullRequest
2 голосов
/ 15 марта 2011

Я написал программу на 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 при первом запуске?

...