【问题标题】:How to use RegDeleteTree to delete KEY_WOW64_64KEY key?如何使用 RegDeleteTree 删除 KEY_WOW64_64KEY 键?
【发布时间】:2015-07-30 09:46:24
【问题描述】:

我已经在 32 位程序中测试了 RegDeleteTree()。它只删除KEY_WOW64_32KEY 键。是否有类似RegOpenKeyEx() 的函数来指定KEY_WOW64_32KEYKEY_WOW64_64KEY

我已经厌倦了这段代码:

HKEY key = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\asd"), 0, KEY_READ | KEY_WOW64_64KEY, &key) == ERROR_SUCCESS)
{
    long d = RegDeleteTree(key, NULL);

    if (d != ERROR_SUCCESS)
    {
        cout << "Error" << d;
    }
    else
    {
        cout << "Success";
    }
}

输出为 Success,但注册表项仍存在。我在带有 VS 2013 的 Windows 7 上运行它并编译为 win32 程序而不是 x64。

【问题讨论】:

  • 我相信您只需要在RegOpenKeyEx() 调用上设置appropriate flag 并将返回的句柄用作RegDeleteTree() 的参数。
  • @Phylogenesis 但是,它不起作用。
  • @zzy:定义“不起作用”。你想达到什么目的?你的实际代码是什么样的?你期望发生什么,它实际上(不)在做什么?有报错码吗?

标签: winapi 64-bit registry


【解决方案1】:

使用RegOpenKeyExKEY_WOW64_64KEY 打开密钥的64 位视图。然后调用RegDeleteTree 传递返回的密钥。


关于您的更新。您只在打开密钥时要求读取权限。 RegDeleteTree 的文档指出:

必须使用以下访问权限打开密钥:DELETE、KEY_ENUMERATE_SUB_KEYS 和 KEY_QUERY_VALUE。

调用成功的事实让我认为您的流程受虚拟化的影响。您需要有一个强制 UAC 提升的过程的清单。在清单中使用 requireAdministrator 选项。

【讨论】:

  • 我试过RegDeleteTree(returnedKey, NULL)但是没用。
  • 我仍然相信我的回答是准确的
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 2020-12-03
  • 2012-09-29
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2018-11-10
相关资源
最近更新 更多