4

我有一个在 C++ 中似乎无法读取的注册表项,但它显示在Regedit.

使用以下 C++ 片段:

openResult=RegOpenKeyEx( HKEY_LOCAL_MACHINE, _TEXT("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ, &root);
readResult1=RegQueryValueEx(root, _TEXT("InstallPath"), NULL, NULL, data1, &size);
readResult2=RegQueryValueEx(root, _TEXT("fake_entry"), NULL, NULL, data2, &size);

ERROR_FILE_NOT_FOUND我第二次RegQueryValueEx()打电话时收到错误 2 。

如下图所示,我的fake_entry存在。

在此处输入图像描述

我通过创建此条目Regedit

Microsoft's Registry Keys Affected by WOW64不包括我要读取的位置,如下图所示,我fake_entry不在该Wow6432Node位置。

在此处输入图像描述

  • 是的,我知道这不是我应该更改的注册表位置。我在调试代码时偶然发现了这一点,并且很好奇为什么我的添加fake_entry不起作用。
  • 是的,我读过Registry Redirector
  • 是的,我读过这个问题
  • 是的,我尝试阅读fake_entrySOFTWARE\\Wow6432Node\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full出现同样的错误。

在 Visual Studio 2010 中运行 Windows 7、64 位、C++,使用 ASCII 字符编码。

我误解了注册表重定向器吗?我的代码有问题吗?注册表的某些部分是否有某种权限设置?我显然错过了一些东西。请指出我正确的方向。

4

2 回答 2

2

您误读了受 WOW64 影响的键表。从该页面的最顶部:

下表列出了被重定向、由 32 位和 64 位应用程序共享或在 64 位 Windows 上重定向和反映的注册表项。除非另有说明,否则此表中键的子键继承父键的行为。如果密钥没有在此表中列出的父项,则该密钥是共享的。

您的密钥的父级是重定向的 HKLM\Software。因此,您的密钥也会被重定向。正如我引用的文档所解释的那样,它从其父级继承。

您需要使用 KEY_WOW64_64KEY 读取 64 位视图。

于 2013-10-26T07:47:49.583 回答
1

Try

openResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _TEXT("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ|KEY_WOW64_64KEY, &root);

according to MSDN you should use either KEY_WOW64_64KEY or KEY_WOW64_32KEY for WOW64 access

于 2013-10-26T07:31:46.970 回答