枚举所有注册表项的最有效方法

时间:2014-04-20 16:51:41

标签: c++ winapi registry

我正在使用以下函数枚举向量中特定键和子键的所有注册表键并将其返回。

但是这个代码似乎对大型键值运行速度非常慢,比如200,000+以上的密钥,完成需要5分钟以上。 只是想知道如何才能提高效率。

vector<string> CRegistryAPI::EnumKeys(HKEY RootKey, string SubKey)
{
    DWORD keyLen = 255;
    int index = 0;
    int ret = 0;
    PFILETIME lastWrite = 0;
    HKEY hKey = 0;
    char keyName[255];
    vector<string> keyList;

    if (RegOpenKeyExA(RootKey, SubKey.c_str(), 0, KEY_ENUMERATE_SUB_KEYS,&hKey) != ERROR_SUCCESS)
        return keyList;
    do
    {
        ret = RegEnumKeyExA(hKey, index, keyName, &keyLen, 0, 0, 0, lastWrite);
        if (ret == ERROR_SUCCESS)
        {
            keyList.push_back(keyName);
        }
        index ++;
        keyLen = 255; 
    }
    while (ret == ERROR_SUCCESS);

    if (hKey != NULL)
        RegCloseKey(hKey);

    return keyList;
}

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

您可以执行的一项优化是使用RegQueryInfoKey()查询有关给定密钥的信息,然后再枚举其内容。例如,您可以预先分配矢量的容量,以便在枚举期间不必多次重新分配:

RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, &dwNumValues, 0, 0, 0, 0);
keyList.reserve(keyList.size()+dwNumValues);

此外,当您将缓冲区推入向量时,您的枚举不能确保缓冲区以空值终止。即使它是,你的推送方式目前需要std::string来计算每次的缓冲区长度。您应该使用返回给您的缓冲区长度:

keyList.push_back(string(keyName, keyLen));