2

私の上司は Windows 7 を入手したばかりで、XP で問題なく動作する当社のインストーラーの 1 つを実行しようとしました。Windows 7 では、インストーラーはエラーなしで実行されます。ただし、HKEY_LOCAL_MACHINE\SOFTWARE{Company}{product} の下にレジストリ キーは作成されません。これらのキーは XP で正しく作成されます。

誰かがこの問題に遭遇しましたか? 権利/セキュリティの問題だと思いますが、確信が持てませんし、実験する Windows 7 も持っていません。

編集

問題のコンピューターは、64 ビット Windows を実行している 64 ビット マシンです。Windows 7 が 32 ビット アプリケーションを HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node{Company}{product} にリダイレクトすることが判明しました。問題は、アプリケーション コードが次のようなハードコードされた値を使用してレジストリにアクセスしようとすることです。

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

それで、私の新しい質問は、Windows 9 のレジストリ リダイレクトが機能するようにレジストリにアクセスするにはどうすればよいかということです。

4

4 に答える 4

4

.NET 4 を使用している場合は、メソッドを使用して、32 ビット (または 64 ビット) プロセスがレジストリの 64 ビット ビューにアクセスするように具体的に要求できますRegistryKey.OpenBaseKey

参照。http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx

32 ビット プロセスの一部として実行されている場合でも、レジストリの 64 ビット ビューから値を読み取る例を次に示します。

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

このRegistryKey.OpenBaseKeyメソッドでは、レジストリの 32 ビット ビューを明示的に開くこともできます。これは、逆に 64 ビット プロセスからレジストリの 32 ビット ビューにアクセスしようとしていて、レジストリ パスに "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);
}   

Windows の 64 ビット バージョンでは、上記のコードは次のサブキー ツリーをレジストリから削除します。

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

-アダム

于 2011-11-08T19:54:42.503 に答える
2

さらに掘り下げた後、.NET アプリケーションのレジストリ アクセス ルールを説明するこのリンクに出会いました。私のプログラムは当初、「AnyCpu」を対象としていたため、Windows が Wow6432Node の下にインストールしたにもかかわらず、アプリは 64 ビット レジストリを対象としていました。ターゲットを「x86」に設定すると、私のプログラムは「魔法のように」Wow6432Node の下のレジストリにアクセスし始めました。図に行く!

于 2010-02-17T23:03:20.270 に答える
1

C Windows API では、これはKEY_WOW64_64KEYへの呼び出しsamDesiredでパラメーターを設定することによって行われます。これは、レジストリ値のルックアップが、WOW32Node エントリではなく、通常の 64 ビット エントリにマップされることを意味します。Registry クラスはこれらの操作をサポートしていないように見えますが、.Net でこれをどのように達成するかわかりませんが、新しいクラスを通じて提供されているのではないでしょうか?RegOpenKeyEx

于 2010-02-17T22:17:31.203 に答える
0

レジストリの反映

コードサンプル

于 2010-02-17T21:59:51.380 に答える