使用 32 位应用程序修改 64 位注册表,反之亦然
Posted
技术标签:
【中文标题】使用 32 位应用程序修改 64 位注册表,反之亦然【英文标题】:Modifying 64-bit registries using 32-bit application or vice versa 【发布时间】:2019-12-28 02:37:53 【问题描述】:我已经在 C# 中看到了这个问题的答案,但是我使用的 C++ 解决方案对我不起作用。我可以将应用程序设置为 64 位,但是我无法修改 32 位注册表,因此我想在一个应用程序中修改两个注册表。
现在我发现 64 上的 32 位效果更好,所以我要走这条路 - 但如果 64 位访问 32 位更容易,请告诉我。
我使用以下来初始化:
RegistryKey^ key = Registry::LocalMachine;
然后如下删除一个注册表值:
if (key->OpenSubKey(PATH))
key->DeleteSubKeyTree(PATH);
PATH 类似于 SOFTWARE\\WOW6432Node\\Apple Computer, Inc.\\QuickTime
现在,根据 c++ 架构是 32 位还是 64 位,我可以删除其中一个。删除两者很麻烦。
64 位有这样的东西吗:
RegistryKey^ wygRegKey = Microsoft::Win32::Registry::LocalMachine->OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
如果有的话,我可以发送 cmd 命令来删除注册表,然后检查它是否存在日志,但我不想冒险丢失错误。
【问题讨论】:
【参考方案1】:您需要使用RegistryKey.OpenBaseKey()
为所需的注册表视图(32 位或 64 位)创建一个RegistryKey
对象。
RegistryKey ^key = RegistryKey::OpenBaseKey(RegistryHive::LocalMachine, RegistryView::Registry32);
// the next call maps to "SOFTWARE\\WOW6432Node\\Apple Computer" on a 64bit system...
if (key->OpenSubKey("SOFTWARE\\Apple Computer, Inc."))
key->DeleteSubKeyTree("QuickTime");
key->Close();
string path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
RegistryKey^ key;
key = RegistryKey::OpenBaseKey(RegistryHive::LocalMachine, RegistryView::Registry32);
key->DeleteSubKeyTree(path);
key = RegistryKey::OpenBaseKey(RegistryHive::LocalMachine, RegistryView::Registry64);
key->DeleteSubKeyTree(path);
【讨论】:
以上是关于使用 32 位应用程序修改 64 位注册表,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章