使用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
相关产品推荐
相关产品推荐

