Как прочитать реестр в 32-битном приложении c #, чтобы перенаправление реестра работало на 64-битной Windows 7 - PullRequest
1 голос
/ 17 февраля 2010

Мой босс только что получил Windows 7, и он попытался запустить один из наших установщиков, который прекрасно работает под XP. В Windows 7 установщик работает без каких-либо ошибок. Однако он не создает разделы реестра в разделе HKEY_LOCAL_MACHINE \ SOFTWARE {Company} {product}. Эти ключи создаются правильно под XP.

Кто-нибудь сталкивался с этой проблемой? Я подозреваю, что это проблема прав / безопасности, но я не уверен, и у меня нет Windows 7 для экспериментов.

EDIT

Данный компьютер является 64-битным компьютером под управлением 64-битной Windows. Оказывается, Windows 7 перенаправляет 32-разрядные приложения в HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node {Company} {product}. Проблема в том, что мой код приложения пытается получить доступ к реестру, используя жестко запрограммированное значение, например:

var t = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\..., "ValueName", DefaultValue);

Итак, мой новый вопрос: как мне получить доступ к реестру, чтобы перенаправление реестра Windows 9 просто работало?

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Если вы используете .NET 4 , вы можете специально запросить, чтобы ваш 32-разрядный (или 64-разрядный) процесс получил доступ к 64-разрядному представлению реестра, используя метод RegistryKey.OpenBaseKey.

Ср.http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx

Вот пример, который считывает значение из 64-разрядного представления реестра, даже если оно выполняется как часть 32-разрядного процесса:

var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var key = hklm.OpenSubKey(@"SOFTWARE\AcmeSoft\AnvilMaker 1.0");
var value = (string) key.GetValue("Blacksmith Name");

The *Метод 1012 * также позволяет явно открыть 32-битное представление реестра.Это полезно, если вы пытаетесь пойти по другому пути и получить доступ к 32-разрядному представлению реестра из 64-разрядного процесса, и вы не хотите явно добавлять "Wow6432Node" в путь реестра.

Например, сегодня мне нужно было удалить дерево подключей в и в 32-битном и 64-битном представлениях реестра.Сделать это в .NET 4 с одним путем к реестру было легко:

foreach(var view in new[] {RegistryView.Registry32, RegistryView.Registry64})
{
     var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view);
     hklm.DeleteSubKeyTree(@"SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant", throwOnMissingSubKey: false);
}   

В 64-разрядной версии Windows приведенный выше код удалит из реестра следующие деревья вложенных ключей:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AcmeSoft\SomeKeyWeNoLongerWant

-Адам

2 голосов
/ 18 февраля 2010

После дополнительных копаний я наткнулся на ссылку , в которой описаны правила доступа к реестру для приложений .NET. Моя программа изначально была предназначена для «AnyCpu», что заставляет приложение ориентироваться на 64-битный реестр, даже если Windows установила его под Wow6432Node. Установив целевое значение «x86», моя программа «волшебным образом» начала получать доступ к реестру под Wow6432Node. Иди разберись!

1 голос
/ 18 февраля 2010

В API C Windows это делается путем установки параметра samDesired в вызове RegOpenKeyEx на KEY_WOW64_64KEY . Это означает, что поиск значения реестра будет сопоставлен с обычной 64-битной записью, а не с WOW32Node. Я не понимаю, как бы вы достигли этого в .Net, хотя, как представляется, класс Registry не поддерживает эти операции, но, возможно, он предоставляется через более новый класс?

0 голосов
/ 18 февраля 2010
...