我很难在我的程序中访问注册表(C#),详情如下:
例如:
我正在运行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”)
请写一个详细的答案(更喜欢用代码示例)。 谢谢
答案 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位视图中。