从32位应用程序
我有一个是创建一些注册表项一个Visual Studio安装程序创建64位注册表项(非WOW64):从32位应用程序
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但创建注册表项Wow6432Node下自动出现:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在我的C#代码中创建注册表项时,如何在msi执行的C#代码中忽略Wow6432Node?
只是FYI,.NET 4.0本身就支持这一点。例如:
RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
然后,您可以使用RegistryBase变量HKLM的64位视图访问任何东西。相反,Registry32将让64位应用程序访问注册表的32位视图。
很棒的答案。简单而重要。 – Simon 2010-09-14 23:48:34
看看http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。您需要使用注册表重定向器并传入访问掩码的适当值。不幸的是,你需要pInvoke。
哦太棒了。有人写了一个很好的.NET API来包装pinvoke调用并使其不那么糟糕吗? – 2010-02-04 03:40:29
我不会说这真的太可怕了。也许有点不方便。只需添加DllImports并定义KEY_WOW64_64KEY。可以在http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx上找到更简洁的示例(用于删除)。 – nithins 2010-02-04 03:53:14
因为很少有文档中关于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
的需要。
我想,因为你的应用程序是32位的,所以Windows确保所做的修改来自于'Wow6432Node'。要将它从该节点中取出并将条目置于正常路径下,应用程序应该是64位的。 – legends2k 2010-02-20 01:15:59