You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RegOpenKeyEx返回ERROR_NO_MORE_FILES:HKCU注册表路径校验失败

问题分析:RegOpenKeyEx针对HKEY_CURRENT_USER返回ERROR_NO_MORE_FILES的原因

你的代码存在两处关键问题,其中字符串处理的错误是导致HKEY_CURRENT_USER路径验证失败的核心原因:

1. wcscpy_s调用参数错误

wcscpy_s是安全字符串拷贝函数,要求三个参数:目标缓冲区、缓冲区大小、源字符串。但你的代码中仅传入两个参数:

wcscpy_s(keyPath, fullPath + 18); // 错误:缺少缓冲区大小参数

这种错误调用会触发未定义行为:编译器会将fullPath + 18(指针地址)当作缓冲区大小传入,后续拷贝操作会破坏内存,导致keyPath中的路径字符串异常,最终RegOpenKeyEx因无效路径返回错误。

正确的调用方式需要传入目标缓冲区的大小MAX_PATH:

wcscpy_s(keyPath, MAX_PATH, fullPath + 18);

同理,HKEY_LOCAL_MACHINE分支的wcscpy_s调用也需要修正:

wcscpy_s(keyPath, MAX_PATH, fullPath + 19);

2. 可能混淆了注册表子键与值项路径

RegOpenKeyEx仅用于打开注册表子键,无法验证值项是否存在。如果传入的路径(如HKEY_CURRENT_USER\SOFTWARE\TEST\VALUE)中最后一部分VALUE是值项而非子键,RegOpenKeyEx会因找不到对应子键返回错误。

若需验证值项是否存在,需先打开父级子键,再调用RegQueryValueEx或RegGetValue检查值项。

修正后的完整代码

BOOL RegistryPathExists(const WCHAR* fullPath) {
    HKEY hKeyRoot;
    WCHAR keyPath[MAX_PATH];

    const WCHAR* hklmStr = L"HKEY_LOCAL_MACHINE";
    const size_t hklmLen = wcslen(hklmStr);
    const WCHAR* hkcuStr = L"HKEY_CURRENT_USER";
    const size_t hkcuLen = wcslen(hkcuStr);

    if (wcsncmp(fullPath, hklmStr, hklmLen) == 0) {
        hKeyRoot = HKEY_LOCAL_MACHINE;
        // 处理仅传入根键的情况
        if (fullPath[hklmLen] != L'\\') {
            return TRUE;
        }
        wcscpy_s(keyPath, MAX_PATH, fullPath + hklmLen + 1);
    } else if (wcsncmp(fullPath, hkcuStr, hkcuLen) == 0) {
        hKeyRoot = HKEY_CURRENT_USER;
        if (fullPath[hkcuLen] != L'\\') {
            return TRUE;
        }
        wcscpy_s(keyPath, MAX_PATH, fullPath + hkcuLen + 1);
    } else {
        return FALSE;
    }

    HKEY hKey;
    LONG result = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ, &hKey);
    if (result == ERROR_SUCCESS) {
        RegCloseKey(hKey);
        return TRUE;
    } else {
        return FALSE;
    }
}

额外优化说明

  • 使用wcslen动态获取根键长度,避免硬编码长度出错;
  • 增加根键后路径分隔符的检查,支持仅传入根键(如HKEY_CURRENT_USER)的场景;
  • 统一使用Windows API标准的TRUE/FALSE,替代C++的true/false。

内容的提问来源于stack exchange,提问作者Drake Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:35:03