首页 > 解决方案 > 注册表查询信息给出了不正确的值

问题描述

使用下面的代码,我一直在尝试查询某个注册表项下的值信息。我只对值的数量、值名称长度和值大小感兴趣。但是当我运行代码时,它只会给出正确的值数量。其他值太长且不正确。如果我延长它改变的值,但除了值的数量之外,除非我完全删除变量,否则这些值永远不会变短。

使用的代码:

HKEY openRegister(HKEY rootKey,const wchar_t* subKey)
{   
    HKEY hKey;
    LONG result=RegOpenKeyEx(rootKey,subKey,0,KEY_QUERY_VALUE | KEY_WOW64_64KEY,&hKey);

    if(result!=ERROR_SUCCESS)
    {
        if(result==ERROR_FILE_NOT_FOUND) 
        {
            cout<<"Key not found"<<endl;            
    } 
        else 
        {
            cout<<"Error opening key"<<endl;            
        }
    }
    
    return hKey;
}

bool infoKey(HKEY regKey,DWORD &numValues,DWORD &maxNameLen,DWORD &maxValueSize)
{
    LONG result=RegQueryInfoKeyA
    (
        regKey,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        &numValues,
        &maxNameLen,
        &maxValueSize,
        NULL,
        NULL
    );
    if(result!=ERROR_SUCCESS)   
    {
        cout<<"Error query info"<<endl;
        return false;
    }
    else return true;
}

调用 openRegister 然后调用 infoKey 函数,给出以下输出:

Number of values: 2
Max name length: 12
Max value size: 12

在注册表编辑器中查看时,这是实际内容:

(default) | REG_SZ | (value not set)
string1   | REG_SZ | Hello
string2b  | REG_SZ | Test

为什么“值的数量”只是正确的?我错过了一些非常明显的东西吗?

提前感谢,本吉。

标签: c++windowswinapiregistry

解决方案


lpcbMaxValueLen参数输出以字节表示的最长数据的大小。您的示例中最长的数据是Hello,它作为 Unicode 字符串(注册表内部存储字符串的格式)为 6 个字符,计算空终止符,大小为 12 个字节(每个字符 2 个字节)。所以maxValueSize设置为 12 是准确的。

lpcbMaxValueNameLen参数输出以 Unicode 字符表示的最长名称的长度,不包括空终止符。您的示例中最长的名称是string2b,长度为 8 个字符。所以你会期望maxNameLen应该设置为 8,而不是 12。但显然有一个未记录的最小大小来命名缓冲区。为什么,谁知道呢。

附带说明一下,您正在使用 Unicode 函数打开密钥,然后使用 ANSI 函数查询其信息。您不应该像这样混合使用 ANSI 和 Unicode API。您应该使用RegQueryInfoKeyW()而不是RegQueryInfoKeyA(), 来匹配您的使用RegOpenKeyExW()RegOpenKeyEx()调用,因为您传递给它一个wchar_t字符串)。


推荐阅读