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

使用Windows crate调用WinAPI打开注册表项出现WIN32_ERROR(87)

问题排查:RegOpenKeyExA 返回 WIN32_ERROR(87)

WIN32_ERROR(87) 对应 ERROR_INVALID_PARAMETER(参数无效),核心问题出在注册表句柄的传递方式上,以下是具体分析和修复方案:

核心问题:输出参数传递错误

RegOpenKeyExA 的最后一个参数 phkResult 是输出参数,需要传递一个指向已分配的 HKEY 变量的指针,用于接收打开的注册表项句柄。而你的代码中直接传递了 ptr::null_mut()(空指针),不符合API要求,导致参数无效错误。

修复后的代码

unsafe {
    let mut hkey: HKEY = ptr::null_mut(); // 声明可变HKEY变量,初始化为空指针
    let reg_open_result = windows::Win32::System::Registry::RegOpenKeyExA(
        HKEY_LOCAL_MACHINE, 
        s!("SOFTWARE"),
        0,
        KEY_QUERY_VALUE,
        &mut hkey // 传递变量的可变指针作为输出参数
    );
    println!(">>> {:?}", reg_open_result);
    println!(">>> {:?}", hkey);

    // 打开成功后务必关闭句柄,避免资源泄漏
    if reg_open_result.is_ok() {
        RegCloseKey(hkey);
    }
}

额外注意事项

  • 你的s!宏实现是正确的,它能生成以空字符结尾的C风格字符串,符合RegOpenKeyExA对ANSI字符串的要求。
  • 若64位程序需要访问32位注册表项,可在权限参数中添加KEY_WOW64_32KEY标志,但当前错误并非由此导致。
  • 注册表句柄属于系统资源,操作完成后必须调用RegCloseKey释放。

内容的提问来源于stack exchange,提问作者enno.void

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:49:52