AnyCPU程序,c#读取多个软件注册表(32位& 64位)

本文关键字:注册表 32位 64位 软件注册 软件 程序 读取 AnyCPU | 更新日期: 2023-09-27 17:49:43

我很难在我的程序(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 Node而MSE不在,但是如果我的程序将在32位操作系统上运行,它们都没有Wow Node。

我怎么能写这段代码,使其适用于每一个场景?

场景1:在32位机器上运行,所以所有的软件也都是32位的(没有"Wow64node")。

场景2:在64位机器上运行,所以有些软件是32位的,有些是64位的(需要处理"Wow64node")

请写一个详细的答案(最好有一个代码示例)。谢谢你

AnyCPU程序,c#读取多个软件注册表(32位& 64位)

这本质上和你今天早些时候问的问题是一样的,我回答了这个问题。我不会重复我的回答。你要求的是一些代码。我可以告诉你,但我担心你仍然没有真正理解注册表重定向。我认为在你期望取得任何进展之前,你必须掌握这一点。

要从注册表的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枚举值将被忽略。文档是这样说的:

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