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

但是对于较大的键值,此代码似乎运行得非常慢,例如对于超过200000+个键,则需要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 票数: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));

  ask by foobar translate from so

未解决问题?本站智能推荐:

1回复

枚举注册表项C ++

我想在HKLM \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Run中显示所有注册表项,子项和值,以查看启动时运行的程序。 我正在使用MS中的这段代码。 我感到困惑的是,如果我为“ SOFTWARE \\ Micr
2回复

确定注册表项是否违反注册表值或子项的最佳方法是什么?

我编写了一个程序,该程序在Windows注册表中创建以下子项: 我已经写了第二个程序,它撤销了我的第一个程序的工作。 第二个程序必须在删除子项之前检查该子项是否包含其他子项或值。 如果该子项不包含其他子项或值,则该子项将被删除。 如何检查子项是否包含任何子项或值?
3回复

检查是否存在注册表项

我正在寻找一种干净的方法来检查是否存在注册表项。 如果我试图打开一个不存在的密钥,我认为RegOpenKey会失败,但事实并非如此。 我可以使用字符串处理来查找并打开我正在寻找的那个的父键,然后枚举该键的子键以查明我感兴趣的那个是否存在,但这感觉就像一个性能猪和一种奇怪的方式来实现这样一
1回复

C ++注册表项问题

我有一些c ++代码的问题。 更确切地说,我希望在Windows启动时运行的程序为自动启动注册注册表项。 其余代码放在另一个标题中,我认为你们不需要它。 我在编译时遇到了这个错误
1回复

检查注册表项是否链接到另一个注册表项(或副本)

如何检查注册表项是否使用Winapi链接到另一个? 例如,我需要找出哪个分支是原始的HKEY_LOCAL_MACHINE\\SECURITY\\SAM或HKEY_LOCAL_MACHINE\\SAM\\SAM , HKEY_CURRENT_USER或HKEY_USERS\\S-1-5-21
2回复

以编程方式允许对注册表项进行写访问

在产品安装过程中,我需要以编程方式修改已知注册表项上的访问描述符。 我希望它的工作方式是: 安装程序在管理模式下运行。 创建一个注册表项。 一个函数(我需要的一个函数)从键中查询ACL。 如果此功能发现组“用户”已经具有写访问权,则不应执行任何操作。
2回复

在预定义的注册表项句柄上调用RegCloseKey

考虑一下围绕原始HKEY句柄的C ++包装类的情况。 包装类有一个构造函数重载,它将HKEY句柄作为输入:构造的对象获取输入原始句柄的所有权。 析构函数在包装的句柄上调用RegCloseKey() ,存储在HKEY m_hKey数据成员中。 现在,考虑将HKEY_CURRENT_
3回复

区别:环境变量和注册表项

注册表项和环境变量之间有什么区别? 我认为环境变量只能在Windows OS中找到吗? 而且我听说多数民众赞成在更改这些内容时非常容易,因此信任它们不好吗? 注册表项是否容易更改? 注册表项是否存储在内核中? 我最重要的问题是:我知道环境变量使我知道%APPDATA的路径,
1回复

返回Windows注册表项子项的数组c ++

我在交流无效功能中有此代码来获取和打印Windows注册表项的子项 我如何修改以返回具有所有子项值的数组,谢谢 大卫,您好!感谢您的回应,我无法使用vector<string> subkeys和这些标头正确编译 如果我更改为: 进行此更改后,它起作用了
1回复

信任注册表项或环境变量

我有一个用C ++ WinAPI开发的程序,我需要确定用户正在运行的Windows版本以及“程序文件”的路径。 我知道我可以通过查看Windows环境变量或注册表项来确定(我可以从注册表中获取程序文件的路径吗?)但是哪种方法更好? 我知道环境变量可以轻松更改,因此信任它们不是很好,但