【问题标题】:RegOpenKeyEx/RegGetValue return ERROR_FILE_NOT_FOUND on keys that existRegOpenKeyEx/RegGetValue 在存在的键上返回 ERROR_FILE_NOT_FOUND
【发布时间】:2012-06-23 06:51:48
【问题描述】:

注册表函数在确实存在的键上返回“未找到”。我有正确的字符集并使用双反斜杠,所以这不是问题。

这是导出密钥的输出:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Netmon3]
"NetmonVersion"="3.4.2350.0"
"NPLVersion"="03.02"
"InstallDir"="C:\\prog\\netmon3\\"
"NetmonEdition"="Capture and Parser Engine"

这里是函数调用:

x = RegOpenKeyExA(
           HKEY_LOCAL_MACHINE, 
           "SOFTWARE\\Microsoft\\Netmon3", 
           0, 
           KEY_READ, &hKey);

返回值x为2,表示ERROR_FILE_NOT_FOUND。不过,只需使用“SOFTWARE\\Microsoft”作为字符串就可以了。

调用 RegGetValue() 也有同样的问题:

x = RegGetValueA(
        HKEY_LOCAL_MACHINE,
        "SOFTWARE\\Microsoft\\Netmon3",
        "InstallDir",
        RRF_RT_ANY,
        NULL,
        (PVOID)install_directory,
        &BufferSize
        );

再次,我得到 2 作为结果,表示未找到。

我检查了它的权限,所有“用户”都有“读取”权限。

无论我错过了什么,都必须看到一些明显的东西,但绞尽脑汁,我看不到它。

--

Marsh Ray 的答案如下:我在 64 位系统上编译 32 位,而 Netmon3 安装是 64 位的。将构建设置更改为 64 位解决了该问题。

【问题讨论】:

  • 这个 32 位代码是否在 64 位操作系统上运行?
  • 检查虚拟化密钥(搜索 Wow6432Node)。

标签: windows registry


【解决方案1】:

也许您在 64 位 Windows 操作系统上作为 32 位进程运行?

【讨论】:

    【解决方案2】:

    您也可以使用 32 位代码,但是您必须指定一个附加标志:

    REGSAM flag = KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS;
    
    if(isWin64Bit()) flag |= KEY_WOW64_64KEY;
    else flag |= KEY_WOW64_32KEY;
    
    LONG err = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, SOME_REGKEY, 0, flag, &hKey);
    

    isWin64Bit 方法的实现可以在here找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多