【问题标题】:Why is RegOpenKeyEx() returning error code 2 on Vista 64bit?为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2?
【发布时间】:2010-09-20 02:52:03
【问题描述】:

我正在拨打以下电话:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C++、Visual Studio 5、Vista 64 位)。

即使“regedit”显示密钥存在,它也会失败并显示错误代码 2(“找不到文件”)。此代码一直适用于 32 位 XP。为什么明明有文件却“找不到文件”?

【问题讨论】:

    标签: c++ winapi windows-vista registry wow64


    【解决方案1】:

    您必须使用“使用多字节字符集”进行编译或将代码中的字符串转换为 (LPWSTR)

    【讨论】:

      【解决方案2】:

      是的,win7 64B,再添加标志KEY_WOW64_64KEY,就可以了。 如果不行,请参考http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx

      【讨论】:

        【解决方案3】:

        我发现我可以使用以下标志解决我的问题:KEY_WOW64_64KEY,如:

        result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
        

        完整解释:32-bit and 64-bit Application Data in the Registry

        【讨论】:

          【解决方案4】:

          我遇到了类似的问题。 我正在使用:

          dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                             (LPWSTR)"SOFTWARE\\0test",
                                             0,
                                             WRITE_DAC ,
                                             &hKey);
          

          那没用。我像这样尝试过,它奏效了:

          dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                             _T("SOFTWARE\\0test"),
                                             0,
                                             WRITE_DAC ,
                                             &hKey);
          

          【讨论】:

          • 永远不要仅仅插入强制转换来关闭编译器。编译器正确地拒绝编译没有强制转换的第一个。
          【解决方案5】:

          在 Windows 64 位系统上,注册表实际上分为两部分。一部分供 64 位进程使用,一部分供 32 位进程使用。

          例如,如果一个 32 位应用程序以编程方式写入它认为是 HKLM\SOFTWARE\Company\Application 的内容,它实际上被 WoW64 层重定向到 HKLM\SOFTWARE\Wow6432Node\Company\Application。

          因此,当您运行 32 位应用程序并调用 RegOpenKeyEx 时,它实际上是针对 Wow6432Node\ 文件夹而不是常规的 \SOFTWARE 节点工作的。

          【讨论】:

          • 请注意,您不应依赖名为“Wow6432Node”的密钥。改为使用 RegOpenKeyEx 的标志访问其他注册表视图。
          猜你喜欢
          • 2011-01-18
          • 1970-01-01
          • 2017-06-03
          • 2017-06-30
          • 2012-02-18
          • 2015-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多