使用 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 位注册表,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

Qt_32位程序在64位系统下读取64位注册表

Qt_32位程序在64位系统下读取64位注册表

从 32 位安装程序写入 64 位注册表

从 32 位应用程序读取 64 位注册表

C# 32位程序在64位系统下注册表操作

Windows 64 位注册表与32 位注册表