代码之家  ›  专栏  ›  技术社区  ›  slicedlime

检查注册表项是否存在

  •  8
  • slicedlime  · 技术社区  · 17 年前

    我正在寻找一种干净的方法来检查注册表项是否存在。我以为 RegOpenKey

    我可以使用字符串处理来查找并打开我正在查找的父键,然后枚举该键的子键,以确定我感兴趣的子键是否存在,但这感觉既像是一种性能限制,又是一种必须实现如此简单函数的奇怪方式。

    RegQueryInfoKey 尽管如此,MSDN并没有给出太多的细节,即使这是可能的。

    使现代化

    MSDN中的文档似乎表明,您应该能够为读取权限打开一个密钥,如果该密钥不存在,则会得到一个错误,如下所示:

    lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
    
    if (lResult != ERROR_SUCCESS) 
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
    

    然而,我明白了 ERROR_SUCCESS 当我尝试这个的时候。

    :我的确切代码是:

    HKEY subKey = nullptr;
    LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
    if (result != ERROR_SUCCESS) {
    

    ... 但是 result 是 ,即使我试图打开一个不存在的密钥。

    更新3 字体看起来你们是对的。这在一个特定的测试示例中失败(神秘地)。如果我在任何其他键上尝试,它将返回正确的结果。使用注册表编辑器对其进行双重检查仍然不会显示该项。我不知道该怎么看待这些。

    3 回复  |  直到 8 年前
        1
  •  13
  •   Byron Whitlock    17 年前

    首先,不要担心这样的东西的性能。除非您每秒查询100次,否则它将足够快。过早的优化会让你头痛不已。

    如果找到密钥,RegOpenKeyEx将返回错误\u SUCCESS。只要对照这个常数,你就可以开始了。

        2
  •  7
  •   1800 INFORMATION    17 年前

    RegOpenKey 如果密钥不存在,则返回错误。你是怎么用的?预期的返回值为 ERROR_FILE_NOT_FOUND .

    从您的代码:

    HKEY subKey = nullptr;
    LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
    if (result != ERROR_SUCCESS) {
    

    我会看看 key 和 subPath subKey 之后它显然是在打开一些东西——尝试枚举它,看看它下面的键和值是什么。

    没有问题

    也许您有一个注册表项对您(运行注册表编辑器的用户)不可见,但对您的代码不可见?可能是权限问题吧?您的代码在windows Vista或server 2008中是否以提升用户身份运行?您是否尝试以管理员身份运行注册表编辑器?

        3
  •  1
  •   MSalters    17 年前

    请注意,除了以“Reg”开头的“core”注册表函数外,还有以“SHReg”开头的helper函数。这些都是为了 use by the Shell