如何使我的应用程序访问注册表项无论是32位还是64位?

时间:2014-03-13 07:10:38

标签: c# windows winapi 64-bit

我正在运行为AnyCPU编译的C#应用​​程序。它访问registrykeys并获取它们的值。如果密钥不存在,它将使用默认值创建密钥。我正在使用函数Registry.LocalMachine.CreateSubKey(strRegistryPath)来执行此操作,其中strRegistryPath是\ SOFTWARE \ MyAppln。密钥是在32位计算机上的HKLM \ SOFTWARE \ MyAppln中创建的,并且工作正常。但是当我尝试在64位计算机上使用相同的程序时,密钥将在HKLM \ SOFTWARE \ Wow6432Node \ MyAppln中创建。由于这个原因,我无法正确读取这些值。

如何让我的程序在32位和64位机器上运行?

2 个答案:

答案 0 :(得分:1)

如果您希望在HKLM\Software下创建密钥,则您将受到registry redirector的约束。如果要编写相同的位置而不管代码是32位还是64位,则必须选择一个注册表视图,并始终在那里写入。选择32位视图或64位视图,这并不重要。

一旦您开始思考,请使用RegistryView枚举来强制使用您选择的注册表视图。请注意,在32位系统上,只有一个注册表视图,因此忽略了您使用的RegistryView的值。

例如,如果您使用RegistryView.Registry64打开密钥,那么您的密钥将永远不会出现在Wow6432Node下,WOW64重定向下的32位视图。并且你可以在一个32位系统上完美地使用RegistryView.Registry64,它只是被忽略了。

您应该知道您的程序需要提升,因为它写入HKLM。这可能会让用户感到恼火。

答案 1 :(得分:0)

这取决于您的目标平台。您需要考虑注册表反射的工作原理(s。http://msdn.microsoft.com/en-us/library/windows/desktop/aa384235(v=vs.85).aspx)。请注意,Windows 7和Windows Server 2008 R2(s。http://msdn.microsoft.com/en-us/library/windows/desktop/dd464643(v=vs.85).aspx)中的行为已更改。