我创建了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());
}
答案 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