RegOpenKeyEx / RegGetValue对存在的键返回ERROR_FILE_NOT_FOUND

时间:2012-06-21 04:07:19

标签: windows registry

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

以下是导出密钥的输出:

[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位修复了问题。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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