Any CPU程序,C#读取多个软件的注册表(32位和64位)

时间:2014-03-11 16:11:37

标签: c# registry 32bit-64bit

我很难在我的程序中访问注册表(C#),详情如下:

  • 我的程序运行在32位& 64位操作系统。
  • 我的程序需要获取软件的注册表项,有些软件有64个版本,有些没有。

例如:

我正在运行64位操作系统,我需要读取2个注册表项,这样我才能知道2个不同软件的安装位置,其中一个有64位版本,所以我不需要“\ Wow64node”一个只有32位版本所以我需要“\ Wow64node \”

// 1.MSE: (64 bit version)
       string installPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Antimalware", "InstallLocation", null);
       if (installPath != null)
       {
           listViewAV.Items.Add("MSE");
       }
// 2.Avast: (32 bit version)
       installPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AVAST Software\Avast", "ProgramFolder", null);
       if (installPath != null)
       {
           listViewAV.Items.Add("Avast");
       }

注意 Avast是在Wow节点而MSE不是,但如果我的程序将在32位操作系统上运行,则它们都没有Wow节点。

我如何编写此代码以使其适用于每种情况?

场景1:在32位机器上运行,因此所有软件也将是32位(没有“Wow64node”)。

场景2:在64位计算机上运行,​​因此一些软件将是32位,一些和一些64位(需要处理“Wow64node”)

请写一个详细的答案(更喜欢用代码示例)。 谢谢

1 个答案:

答案 0 :(得分:1)

这与你今天早些时候提到的question基本相同,我回答说。我不会重复我的回答。你要的是一些代码。我可以告诉你,但我担心你仍然不能理解注册表重定向器。我认为你必须先了解它,然后才能取得任何进展。

要从注册表的32位视图中读取值,例如Avast,请使用以下代码:

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
    RegistryView.Registry32);
rk = rk.OpenSubKey(@"SOFTWARE\AVAST Software\Avast");
string installPath = null;
if (rk != null)
{
    installPath = rk.GetValue("ProgramFolder", null);
}
if (installPath != null)
{
    .... // Avast registry setting found
}

对于在注册表的64位视图中注册的程序,例如MSE,请执行以下操作:

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
    RegistryView.Registry64);
rk = rk.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft Antimalware");
string installPath = null;
if (rk != null)
{
    installPath = rk.GetValue("InstallLocation", null);
}
if (installPath != null)
{
    .... // Avast registry setting found
}

您不必担心自己是在32位还是64位系统上运行。在64位系统上,两个视图都存在,您将获得您请求的视图。在32位系统上,仅存在32位视图,并且忽略您传递的RegistryView枚举的值。 documentation这样说:

  

如果在32位操作系统上请求64位视图,则返回的键将位于32位视图中。