注册表项已删除但仍可从注册表中获取值#

时间:2017-06-09 13:02:12

标签: c# .net winforms registry

我创建了Windows应用程序。当我通过代码创建注册表值时,它运行良好,但在从注册表中删除后(我正在使用cmd中的regedit删除该注册表)。当我从visual studio调试时,仍然在我的代码中显示该值。

我的注册表创建代码

RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\TOPO");
if (key != null)
{
   //key.SetValue("interval", "5000");
   key.SetValue("Topos", 1, RegistryValueKind.DWord);
   key.Close();
}

然后我正在检查Program.cs的值

string strval = string.Empty;
RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\TOPO");
if (key != null)
{
   //key.SetValue("interval", "5000");
   bb = Convert.ToInt32(key.GetValue("Topos"));
   key.Close();
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

if (bb == 1)
{ 
    Application.Run(new frm_mdi());
}
else
{
    Application.Run(new frm_activation());
}

2 个答案:

答案 0 :(得分:1)

在Windows XP及更高版本中,某些注册表项在32位和64位进程之间重定向,反映或共享。根据{{​​3}},特别应将HKLM\Software\TOPO重定向到HKLM\Software\WOW6432Node\TOPO。有关重定向的更多信息this article。 因此,当您使用 Regedit (64位)从注册表中删除密钥时,该密钥的32位版本仍保留在注册表中。

选项1

如果可能,请让您的应用程序在64位Windows上以64位进程运行。假设您正在使用Visual Studio并且您的应用程序以任何CPU 解决方案平台为目标,您可以通过右键单击项目 - >来完成此操作。 属性 - > 构建标签并取消选中"首选32位"所有所需配置的复选框。

选项2

修改您的程序,即使它以32位进程运行,也要访问64位版本的注册表。你可以这样做:

var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    .OpenSubKey(@"SOFTWARE\TOPO");

如果您需要更多详细信息,请参阅here

选项3

使用regedit删除/修改/创建注册表时,只需编辑HKLM\Software\WOW6432Node\TOPO密钥而不是HKLM\Software\TOPO

答案 1 :(得分:0)

我有一个类似的问题,就我而言,我发现基于VSTO的Office加载项还有另一种注册表项重定向。如果您使用Office的全新即点即用安装并从Office加载项中保存/读取注册表项,则可能会将其重定向到其他位置,例如:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\TOPO