下面代码为啥不能获取注册表全路径?

为啥buffer里没有全路径,只输出空值,谢谢。

#include <iostream>
#include <windows.h>

int main() {
    HKEY hKey;
    LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_QUERY_VALUE, &hKey);

    if (result == ERROR_SUCCESS) {
        char buffer[MAX_PATH];
        DWORD bufferSize = MAX_PATH;
        result = RegGetValue(hKey, nullptr, L"", RRF_RT_REG_SZ, nullptr, buffer, &bufferSize);

        if (result == ERROR_SUCCESS) {
            std::cout << "注册表子键全路径字符串: " << buffer << std::endl;
        }
        else {
            std::cout << "获取注册表子键全路径字符串失败" << std::endl;
        }

        RegCloseKey(hKey); // 关闭注册表句柄
    }



    else {
        std::cout << "注册表子键位置打开失败" << std::endl;
    }

    return 0;
}


试下

#include <iostream>
#include <windows.h>

int main() {
    HKEY hKey;
    LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_QUERY_VALUE, &hKey);

    if (result == ERROR_SUCCESS) {
        char buffer[MAX_PATH];
        DWORD bufferSize = MAX_PATH;
        memset(buffer, 0, sizeof(buffer)); // 初始化buffer数组

        result = RegGetValue(hKey, nullptr, L"", RRF_RT_REG_SZ, nullptr, buffer, &bufferSize);

        if (result == ERROR_SUCCESS) {
            std::cout << "注册表子键全路径字符串: " << buffer << std::endl;
        }
        else {
            std::cout << "获取注册表子键全路径字符串失败" << std::endl;
        }

        RegCloseKey(hKey); // 关闭注册表句柄
    }
    else {
        std::cout << "注册表子键位置打开失败" << std::endl;
    }

    return 0;
}


这段代码中获取注册表子键全路径字符串的操作可能返回空值的原因是使用的是错误的参数。在调用RegGetValue函数时,第三个参数应该是一个字符串,指定要查询的注册表子键的名称,而不是一个空字符串L""。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7675710
  • 以下回答来自chatgpt:

    问题的根本原因是因为没有定义 get_registry_path() 函数,所以代码无法获取注册表的全路径。根据问题描述,通过以下步骤可以解决这个问题:

    1. 确保已经导入必要的库文件:

      python import winreg # 导入winreg库

    2. 创建 get_registry_path() 函数,获取注册表的全路径:

      ```python def get_registry_path(): try: # 打开注册表根键 registry_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion")

          # 读取注册表项的值
          registry_value = winreg.QueryValue(registry_key, "ProgramFilesDir")
      
          # 返回注册表项的全路径
          return registry_value
      except Exception as e:
          print(e)
          return None
      

      ```

      以上代码会打开注册表根键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion,并读取其中名为 ProgramFilesDir 的注册表项的值。

    3. 调用 get_registry_path() 函数,并打印结果:

      ```python buffer = None try: # 获取注册表的全路径 buffer = get_registry_path() except Exception as e: print(e)

      print(buffer) ```

    最终的代码如下所示:

    import winreg  # 导入winreg库
    
    def get_registry_path():
        try:
            # 打开注册表根键
            registry_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion")
    
            # 读取注册表项的值
            registry_value = winreg.QueryValue(registry_key, "ProgramFilesDir")
    
            # 返回注册表项的全路径
            return registry_value
        except Exception as e:
            print(e)
            return None
    
    buffer = None
    try:
        # 获取注册表的全路径
        buffer = get_registry_path()
    except Exception as e:
        print(e)
    
    print(buffer)
    

    请注意,在修改代码后,确保已经运行了所有必需的库文件,才能正常运行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^