使用 32 位应用程序修改 64 位注册表,反之亦然

Modifying 64-bit registries using 32-bit application or vice versa

我已经在 C# 中看到了此问题的答案,但我使用的 C++ 解决方案对我不起作用。我可以将应用程序设为 64 位,但后来我失去了修改 32 位注册表的机会,所以我想在一个应用程序中修改两个注册表。

现在我发现 32 位在 64 位上工作得更多,所以我会走那条路 - 但如果 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 命令删除注册表,然后检查日志是否存在,但我不想冒丢失错误的风险。

您需要使用 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);