从32位应用程序创建64位注册表项(非WOW64)

时间:2010-02-04 03:12:20

标签: 64-bit windows-installer registry 32-bit wow64

我有一个Visual Studio安装程序正在创建一些注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

但它正在创建的注册表项自动出现在Wow6432Node:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp

在msi执行的C#代码中创建注册表项时,如何忽略Wow6432Node?

3 个答案:

答案 0 :(得分:22)

仅供参考,.NET 4.0原生支持此功能。例如:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

然后,您可以使用 RegistryBase 变量访问HKLM的64位视图中的任何内容。相反, Registry32 将允许64位应用程序访问注册表的32位视图。

答案 1 :(得分:1)

看看http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。您需要使用注册表重定向器并传入访问掩码的正确值。不幸的是,你需要pInvoke。

答案 2 :(得分:1)

由于关于OpenBaseKey的文档很少,我将扩展shifuimam的答案并为OP提供解决方案:

Private Sub Foo()
    Dim myAppIs64Bit = Environment.Is64BitProcess
    Dim baseKey As RegistryKey
    If (myAppIs64Bit) Then
        baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    Else
        baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
    End If
    Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp")
End Sub

如果应用为32位,则myAppKey指向HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp。如果是64位,则指向HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

OpenBaseKey的优势在于它无需在代码中引用Wow6432