无法读取C ++中的注册表项

时间:2013-10-25 15:26:39

标签: c++ windows-7 registry

我有一个我似乎无法在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电话会收到错误2,RegQueryValueEx()

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

enter image description here

我是通过Regedit创建此条目的。

Microsoft的Registry Keys Affected by WOW64不包含我正在尝试阅读的位置,如下图所示,我的fake_entry不在Wow6432Node位置。

enter image description here

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

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

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

2 个答案:

答案 0 :(得分:1)

尝试

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

根据MSDN,您应该使用KEY_WOW64_64KEYKEY_WOW64_32KEY进行WOW64访问

答案 1 :(得分:1)

您误读了受WOW64影响的密钥表。从该页面的顶部开始:

  

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

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

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